

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 在 Amazon GameLift Servers 中记录服务器消息
<a name="logging-server-messages"></a>

您可以在日志文件中捕获来自 Amazon GameLift Servers 服务器的自定义服务器消息。配置日志的方式取决于您使用的是自定义服务器还是 Amazon GameLift ServersRealtime，以及您使用的是托管 EC2 舰队还是集装箱舰队（请参阅本章中的相应小节）。

**Topics**
+ [日志差异：托管舰队 EC2 与容器舰队](logging-server-messages-ec2-vs-containers.md)
+ [记录服务器消息（自定义服务器）](logging-server-messages-custom.md)

# 日志差异：托管舰队 EC2 与容器舰队
<a name="logging-server-messages-ec2-vs-containers"></a>

托管 EC2 船队和集装箱船队之间的日志记录行为差异很大。在从容器迁移 EC2 到容器或根据日志要求选择正确的舰队类型时，了解这些差异至关重要。

## 主要区别概述
<a name="logging-ec2-vs-containers-overview"></a>


| 功能 | 托管 EC2 车队 | 容器实例集 | 
| --- | --- | --- | 
| 日志存储 | 游戏会话结束后自动上传到 Amazon S3 | 必须配置 Amazon CloudWatch 日志或自定义日志解决方案 | 
| GetGameSessionLogUrl API | 可用：返回用于下载日志的 Amazon S3 URL | 不可用：日志不会自动存储在 Amazon S3 中 | 
| 日志保留 | 在 Amazon S3 中保留 14 天（自动） | 取决于日志记录配置 | 
| 实时监控 | 有限：日志仅在游戏会话结束后可用 | 与 Amazon L CloudWatch ogs 集成一起可用 | 
| 设置复杂性 | 自动：无需额外配置 | 需要明确的日志记录配置 | 

## 托管 EC2 舰队日志
<a name="logging-ec2-managed-behavior"></a>

对于托管 EC2 舰队，Amazon GameLift Servers提供自动日志管理：
+ **自动上传：**游戏会话结束后，服务器日志会自动上传到 Amazon S3
+ **GetGameSessionLogUrl API：**使用此 API 检索用于从 Amazon S3 下载日志的预签名 URL
+ **14 天保留期：**日志在 Amazon S3 中保留 14 天，然后自动删除
+ **大小限制：**每个游戏会话的日志文件都有大小限制（请参阅 [Amazon GameLift Servers 端点和配额](https://docs.aws.amazon.com/general/latest/gr/gamelift.html)）

有关更多信息，请参阅[记录服务器消息（自定义服务器）](logging-server-messages-custom.md)和 [GetGameSessionLogUrl API 参考](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_GetGameSessionLogUrl.html)。

## 容器实例集日志记录
<a name="logging-container-behavior"></a>

容器实例集需要您明确配置日志记录：
+ **不自动上传到 Amazon S3：**日志不会自动上传到 Amazon S3
+ **GetGameSessionLogUrl 不可用：**此 API 不适用于集装箱舰队
+ **Amazon CloudWatch Logs 集成：**将您的容器配置为将日志发送到 Amazon CloudWatch Logs 以进行集中记录
+ **自定义日志记录解决方案：**使用日志驱动程序或附加容器实施自己的日志记录基础架构
+ **实时访问：**通过适当的配置，可以在游戏会话期间实时访问日志

有关详细的容器日志记录选项，请参阅[容器实例集的工作原理](https://docs.aws.amazon.com/gameliftservers/latest/developerguide/containers-howitworks.html)。

## 迁移注意事项
<a name="logging-migration-considerations"></a>

从托管舰队迁移 EC2 到容器舰队时，请考虑以下日志变更：
+ **更新日志检索代码：将 GetGameSessionLogUrl API 调用替换为** Amazon CloudWatch Logs 查询或您的自定义日志记录解决方案
+ **配置日志保留：**在 Amazon Lo CloudWatch gs 或您的日志系统中设置适当的保留策略
+ **实现实时监控：**利用实时日志访问来提高可观测性
+ **查看日志量和成本：**Amazon Lo CloudWatch gs 定价与托管 EC2 队列中包含的 Amazon S3 存储不同

## 推荐的容器日志记录设置
<a name="logging-recommended-container-setup"></a>

对于容器实例集，我们建议采用以下设置：

1. **Amazon CloudWatch Logs 集成：**配置您的容器定义以使用`awslogs`日志驱动程序

1. **结构化日志记录：**使用结构化日志格式（JSON）提高可搜索性和分析能力

1. **日志级别：**实施适当的日志级别以控制详细程度和成本

1. **保留策略：**根据您的合规性和调试需求设置保留期

# 记录服务器消息（自定义服务器）
<a name="logging-server-messages-custom"></a>

您可以在日志文件中捕获来自 Amazon GameLift Servers 自定义服务器的自定义服务器消息。

**重要**  
每个游戏会话的日志文件大小有限制（请参阅 *AWS 一般参考*中的 [Amazon GameLift Servers 端点和配额](https://docs.aws.amazon.com/general/latest/gr/gamelift.html)）。游戏会话结束时，Amazon GameLift Servers 会将服务器日志上传到 Amazon Simple Storage Service（Amazon S3）。Amazon GameLift Servers 将不会上传超过限制的日志。日志的增长速度可能非常快，并且会超过大小限制。您应该监控日志，将日志输出限制为仅显示必要的消息。

## 为自定义服务器配置日志记录
<a name="configuring-logging-for-custom-servers"></a>

使用 Amazon GameLift Servers 自定义服务器时，您可以自行编写代码来执行日志记录，将其作为服务器进程配置的一部分进行配置。Amazon GameLift Servers 使用您的日志记录配置来识别在每个游戏会话结束时必须上传到 S3 的文件。

以下说明阐述了如何使用简化的代码示例配置日志记录：

------
#### [ C\$1\$1 ]

**配置日志记录 (C\$1\$1)**

1. 创建字符串矢量，这些字符串是游戏服务器日志文件的目录路径。

   ```
   std::string serverLog("serverOut.log");        // Example server log file
   std::vector<std::string> logPaths;
   logPaths.push_back(serverLog);
   ```

1. 提供你的矢量作为你的[ProcessParameters](integration-server-sdk-cpp-ref-datatypes.md#integration-server-sdk-cpp-ref-dataypes-process)对象[LogParameters](integration-server-sdk-cpp-ref-datatypes.md#integration-server-sdk-cpp-ref-dataypes-log)的向量。

   ```
   Aws::GameLift::Server::ProcessParameters processReadyParameter = Aws::GameLift::Server::ProcessParameters(
       std::bind(&Server::onStartGameSession, this, std::placeholders::_1),
       std::bind(&Server::onProcessTerminate, this),
       std::bind(&Server::OnHealthCheck, this),
       std::bind(&Server::OnUpdateGameSession, this),
       listenPort,
       Aws::GameLift::Server::LogParameters(logPaths));
   ```

1. 在调用 [ProcessReady()](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-processready) 时提供[ProcessParameters](integration-server-sdk-cpp-ref-datatypes.md#integration-server-sdk-cpp-ref-dataypes-process)对象。

   ```
   Aws::GameLift::GenericOutcome outcome = 
      Aws::GameLift::Server::ProcessReady(processReadyParameter);
   ```

有关更完善的示例，请参阅[ProcessReady()](integration-server-sdk-cpp-ref-actions.md#integration-server-sdk-cpp-ref-processready)。

------
#### [ C\$1 ]

**配置日志记录 (C\$1)**

1. 创建字符串列表，这些字符串是游戏服务器日志文件的目录路径。

   ```
   List<string> logPaths = new List<string>();
   logPaths.Add("C:\\game\\serverOut.txt");     // Example of a log file that the game server writes
   ```

1. 提供您的列表作为您的[ProcessParameters](integration-server-sdk-csharp-ref-datatypes.md#integration-server-sdk-csharp-ref-dataypes-process)对象。[LogParameters](integration-server-sdk-csharp-ref-datatypes.md#integration-server-sdk-csharp-ref-dataypes-log)

   ```
   var processReadyParameter = new ProcessParameters(
       this.OnGameSession,
       this.OnProcessTerminate,
       this.OnHealthCheck,
       this.OnGameSessionUpdate,
       port,
       new LogParameters(logPaths));
   ```

1. 在调用 [ProcessReady()](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-processready) 时提供[ProcessParameters](integration-server-sdk-csharp-ref-datatypes.md#integration-server-sdk-csharp-ref-dataypes-process)对象。

   ```
   var processReadyOutcome =
      GameLiftServerAPI.ProcessReady(processReadyParameter);
   ```

有关更完善的示例，请参阅[ProcessReady()](integration-server-sdk-csharp-ref-actions.md#integration-server-sdk-csharp-ref-processready)。

------

## 写入日志
<a name="writing-to-logs-for-custom-servers"></a>

您的日志文件在服务器进程启动后就会存在。您可以使用任意方法写入日志来写入文件。要捕获服务器的所有标准输出和错误输出，请将输出流重新映射到日志文件，如以下示例所示：

------
#### [ C\$1\$1 ]

```
std::freopen("serverOut.log", "w+", stdout);
std::freopen("serverErr.log", "w+", stderr);
```

------
#### [ C\$1 ]

```
Console.SetOut(new StreamWriter("serverOut.txt"));
Console.SetError(new StreamWriter("serverErr.txt"));
```

------

## 获取服务器日志
<a name="accessing-logs-for-custom-servers"></a>

日志访问因实例集类型而异：

### 托管式 EC2 实例集
<a name="accessing-logs-managed-ec2"></a>

游戏会话结束后，Amazon GameLift Servers 会自动将日志存储在 S3 存储桶中，并保留这些日志 14 天。要获取游戏会话日志的位置，可以使用 [GetGameSessionLogUrl](https://docs.aws.amazon.com/gamelift/latest/apireference/API_GetGameSessionLogUrl.html)API 操作。要下载日志，请使用操作返回的 URL。

或者，您可以将游戏服务器配置为将日志直接发送到您的首选日志记录服务或存储位置，从而设置自己的日志记录解决方案。有关更多信息，请参阅 [将您的Amazon GameLift Servers托管游戏服务器连接到其他 AWS 资源](gamelift-sdk-server-resources.md)。

### 容器实例集
<a name="accessing-logs-containers"></a>

容器实例集可捕获所有容器中的标准输出和错误流。您可使用以下选项配置日志记录：
+ 将容器输出另存为 CloudWatch 指定日志组中的日志流
+ 将容器输出保存到 S3 存储桶
+ 关闭日志记录（不保存容器输出）

有关在创建容器队列时配置日志记录选项的详细信息，请参阅 Amazon GameLift Servers API 参考[LogConfiguration](https://docs.aws.amazon.com/gameliftservers/latest/apireference/API_CreateContainerFleet.html#gameliftservers-CreateContainerFleet-request-LogConfiguration)中的。