Logtail の収集構成でナノ秒精度を有効にし、時間解析プラグインを設定して、ミリ秒、マイクロ秒、またはナノ秒レベルの高精度タイムスタンプを収集および保存します。収集後、Simple Log Service (SLS) は時間を 2 つのフィールドに分割して保存します。標準の秒レベルのタイムスタンプ __time__ とナノ秒のオフセット __time_ns_part__ です。このプロセスにより、高精度のログのソートと分析が可能になります。
ユースケース
分散トレーシング、高頻度取引、パフォーマンスプロファイリングなどのシナリオ、または厳密なログの順序が重要なシナリオでは、秒レベルの時間精度では不十分です。これらのシナリオのログには、ミリ秒、マイクロ秒、さらにはナノ秒精度のタイムスタンプが含まれていることがよくあります。このガイドでは、Logtail を設定してこの高精度の時間情報を収集、保存、分析し、ログ分析の正確性と時系列順を確保する方法について説明します。
ソリューションアーキテクチャ
LoongCollector (Logtail) は、標準の秒レベルのタイムスタンプに加えてナノ秒レベルのオフセットを保存することで、ナノ秒精度のタイムスタンプを収集します。この設計により、既存の秒ベースの時間システムとの互換性を確保しながら、高精度のソート機能を提供します。
コアワークフローは次のとおりです。
ナノ秒サポートの有効化: Logtail 収集構成の高度なオプションで、
{ "EnableTimestampNanosecond": true }を設定して高精度時間処理を有効にします。これには Logtail 1.8.0 以降が必要で、Linux 環境でのみ利用可能です。ログの解析: デリミタ、JSON、または正規表現プラグインなどの解析プラグインを使用して、生ログから高精度タイムスタンプを含む文字列を抽出します。
時間の変換: 時間解析プラグインは、抽出された時間文字列を標準の時間フォーマットに変換します。
時間の保存: Simple Log Service (SLS) は時間を 2 つのフィールドに分割します。
__time__: 標準の Unix タイムスタンプ (長整数)、秒単位。__time_ns_part__: ナノ秒部分 (長整数)、値の範囲は 0 から 999,999,999 です。
クエリと分析: 厳密な時系列分析を実行するには、
__time__フィールドと__time_ns_part__フィールドの両方でソートします。
実装ステップ
このセクションでは、ナノ秒レベルのタイムスタンプを持つ JSON ログを例として使用し、ログの収集、解析、インデックス構成、および最終的なクエリと分析のための完全なエンドツーエンドの手順を説明します。
ステップ 1: プロジェクトと Logstore の作成
ログを収集する前に、それらを管理および保存するためのプロジェクトと Logstore を計画して作成する必要があります。
プロジェクト: Simple Log Service のリソース管理ユニットで、異なるプロジェクトやサービスのログを分離して管理するために使用されます。
Logstore: プロジェクト内のログのストレージユニット。
すでにプロジェクトと Logstore を作成している場合は、このステップをスキップして ステップ 2: マシングループの設定 (LoongCollector のインストール) に進むことができます。
Log Service コンソールにログインします。
[プロジェクトの作成] をクリックし、次のパラメーターを設定します。
リージョン: ログソースに基づいてリージョンを選択します。これはプロジェクト作成後に変更することはできません。
プロジェクト名: 名前は Alibaba Cloud 内でグローバルに一意である必要があり、作成後に変更することはできません。
その他の構成はデフォルト設定のままにし、[作成] をクリックします。その他のパラメーターの詳細については、「プロジェクトの管理」をご参照ください。
プロジェクト名をクリックして、ターゲットプロジェクトに入ります。
左側のナビゲーションウィンドウで、
を選択し、[+] をクリックします。Logstore の作成ページで、次のコア構成を完了します。
Logstore 名: プロジェクト内で一意の名前を設定します。名前は作成後に変更することはできません。
Logstore タイプ: 仕様比較に基づいて、標準またはクエリタイプを選択します。
課金方法:
機能単位の支払い: ストレージ、インデックス、読み取り/書き込み操作など、各リソースに対して個別に料金が計算されます。この方法は、小規模なシナリオや機能の使用が不確かな場合に適しています。
書き込みデータ量による支払い: 書き込まれた生データの量にのみ基づいて料金が計算されます。この方法には、30 日間の無料ストレージ期間と、データ変換やシッピングなどの無料機能が含まれます。コストモデルはシンプルで、ストレージ期間が 30 日に近い場合やデータ処理パイプラインが複雑な場合に適しています。
データ保持期間: ログを保持する日数を設定します。値は 1 から 3,650 日の範囲で指定できます。値 3650 は永久保存を示します。デフォルトは 30 日です。
他の構成はデフォルト設定のままにし、[OK] をクリックします。他のパラメーターの詳細については、「Logstore の管理」をご参照ください。
ステップ 2: マシングループの設定 (LoongCollector のインストール)
プロジェクトと Logstore を作成した後、サーバーに LoongCollector をインストールし、マシングループに追加します。このトピックでは、Simple Log Service (SLS) プロジェクトと同じ Alibaba Cloud アカウントおよびリージョンにある Elastic Compute Service (ECS) インスタンスを例として使用します。ECS インスタンスがプロジェクトと同じアカウントまたはリージョンにない場合、または自己管理サーバーを使用している場合は、手動インストールの詳細について、「Linux サーバーに LoongCollector をインストールする」をご参照ください。
この機能は Linux 上の LoongCollector (Logtail) でのみ利用可能で、Logtail バージョン 1.8.0 以降が必要です。Windows では効果がありません。
ターゲットプロジェクトをクリックします。Logstore ページで:
すべてのテキストログインポートテンプレートは、解析プラグインのみが異なります。残りの構成プロセスは同じで、後で変更できます。 |
|
構成手順:
[マシングループ構成] ページで、次のパラメーターを構成します。
ユースケース: ホストシナリオ
インストール環境: ECS
マシングループの構成: ターゲットサーバーの LoongCollector のインストール状況とマシングループの構成に基づいて、適切なアクションを選択します。
LoongCollector がインストール済みで、すでにマシングループの一部である場合は、[ソースマシングループ] リストから直接選択し、再度作成することなく [適用されたマシングループ] リストに追加できます。
LoongCollector がインストールされていない場合は、[マシングループの作成] をクリックします。
以下の手順では、LoongCollector の自動インストールと新しいマシングループの作成について説明します。
システムは、プロジェクトと同じリージョンにある ECS インスタンスを自動的にリストします。ログを収集したい 1 つ以上のインスタンスを選択します。
[インストールしてマシングループとして作成] をクリックします。システムは選択された ECS インスタンスに LoongCollector を自動的にインストールします。
マシングループの [名前] を入力し、[OK] をクリックします。
説明インストールが失敗するか、待機状態のままの場合は、ECS リージョンがプロジェクトリージョンと同じであるか確認してください。
LoongCollector がすでにインストールされているサーバーを既存のマシングループに追加するには、FAQ の「既存のマシングループにサーバーを追加するにはどうすればよいですか?」をご参照ください。
ステップ 3: 収集構成の作成
コンソールでの設定
LoongCollector をインストールしてマシングループを設定した後、[Logtail 構成] ページに移動して、ログの収集と処理のルールを定義します。
1. ナノ秒精度サポートの有効化
ログ収集ソースとルールを定義し、ナノ秒精度サポートを有効にします。
グローバル構成:
構成名: プロジェクト内で一意の名前を設定します。構成作成後に名前を変更することはできません。
: ナノ秒精度のサポートを有効にするには、[詳細オプション] スイッチをオンにし、次の JSON コンテンツを入力します。
{ "EnableTimestampNanosecond": true }
入力構成:
タイプ: テキストログ収集。
ファイルパス: ログが収集されるパス。
Linux: フォワードスラッシュ (
/) で始まる必要があります。例:/data/mylogs/**/*.log。このパスは、/data/mylogsディレクトリとそのサブディレクトリ内の.logで終わるすべてのファイルに一致します。Windows: ドライブ文字で始まる必要があります。例:
C:\Program Files\Intel\**\*.Log。
最大ディレクトリ監視深度: [ファイルパス] のワイルドカード
**が一致できる最大ディレクトリ深度。デフォルト値は 0 で、現在のディレクトリのみを監視することを意味します。
2. 処理プラグインの設定
ソースログは JSON 形式であるため、[処理構成] セクションに [JSON - 解析] プラグインを追加します。このプラグインは、JSON オブジェクトからデータを抽出し、個別のログフィールドに分割します。
ログサンプルの追加
ログファイル内のログ形式が次のようになっていると仮定します。ここで、
asctimeフィールドにはナノ秒精度のタイムスタンプが含まれています。{ "asctime": "2023-10-25 23:51:10,199999999", "filename": "generate_data.py", "levelname": "INFO", "lineno": 51, "module": "generate_data", "message": "{\"no\": 14, \"inner_loop\": 166, \"loop\": 27451, \"uuid\": \"9be98c29-22c7-40a1-b7ed-29ae6c8367af\"}", "threadName": "MainThread" }JSON 解析プラグインの追加
[処理プラグインの追加] をクリックし、 を選択し、[確認] をクリックします。
時間解析プラグインの追加
抽出された時間文字列 (
asctimeフィールド) を標準のナノ秒タイムスタンプに変換し、ログエントリのイベント時間として使用します。プラグイン名
コア機能
適用可能なシナリオ
時間解析
基本的な時間解析。
固定フォーマットのシンプルなシナリオ。
ログ時間の抽出 (strptime 形式)
柔軟で、幅広い
strptime形式をサポートします。推奨。包括的な機能と業界標準との互換性。
ログ時間の抽出 (Go 言語形式)
Go 言語の標準ライブラリ形式を使用します。
Go に精通しているユーザー、またはログ形式が Go 標準ライブラリと一致する場合。
時間解析
[処理プラグインの追加] をクリックし、 を選択し、次のパラメーターを設定します。
ソースフィールド: ログ解析前の時間を格納する元のフィールド。この例では
asctimeです。時間フォーマット: ログの時間フィールドの内容に基づいて、対応する時間フォーマットを設定します。この例では
%Y-%m-%d %H:%M:%S,%fです。%fは秒の小数部を表し、ナノ秒までの精度を持ちます。時間フォーマット文字列は、元のログの時間フォーマットと完全に一致する必要があります。これには、秒とナノ秒の間の区切り文字 (例:
,または.) も含まれます。そうでない場合、解析は失敗します。タイムゾーン: ログの時間フィールドのタイムゾーンを選択します。デフォルトでは、マシンのタイムゾーンが使用されます。
ログ時間の抽出 (strptime 形式)
[処理プラグインの追加] をクリックし、 を選択し、次のパラメーターを設定します。
ソースフィールド: ログ解析前の時間を格納する元のフィールド。この例では
asctimeです。ソース時間フォーマット: ログの時間フィールドの内容に基づいて、対応する時間フォーマットを設定します。この例では
%Y-%m-%d %H:%M:%S,%fです。%fは秒の小数部を表し、ナノ秒までの精度を持ちます。時間フォーマット文字列は、元のログの時間フォーマットと完全に一致する必要があります。これには、秒とナノ秒の間の区切り文字 (例:
,または.) も含まれます。そうでない場合、解析は失敗します。
ログ時間の抽出 (Go 言語形式)
[処理プラグインの追加] をクリックし、 を選択し、次のパラメーターを設定します。
ソース時間フィールド: ログ解析前の時間を格納する元のフィールド。この例では
asctimeです。ソース時間フォーマット: 元のログの時間フィールドに基づいて時間フォーマットを設定します。フォーマットは Go 言語の時間フォーマット仕様に従う必要があります。フォーマットのリファレンス時間は Go の誕生時間である
2006-01-02 15:04:05 -0700 MSTです。この例に対応する時間フォーマットは2006-01-02 15:04:05,999999999です。時間フォーマット文字列は、元のログの時間フォーマットと完全に一致する必要があります。これには、秒とナノ秒の間の区切り文字 (例:
,または.) も含まれます。そうでない場合、解析は失敗します。結果時間フィールド: 解析後の時間を格納する宛先フィールド。この例では
result_asctimeです。結果時間フォーマット: 解析後の時間フォーマットで、Go 言語の時間フォーマット仕様に従って記述されます。この例では
2006-01-02 15:04:05,999999999Z07:00です。
3. インデックスの設定
Logtail の設定が完了したら、[次へ] をクリックします。[クエリと分析の設定] ページで:
システムはデフォルトで 全文インデックス を有効にし、キーワードを使用して生ログコンテンツを検索できるようにします。
フィールドによる正確なクエリを実行するには、[プレビューデータ] がロードされるのを待ってから、[インデックスの自動生成] をクリックします。Simple Log Service は、プレビューデータの最初のエントリに基づいて フィールドインデックス を生成します。
設定が完了したら、[次へ] をクリックして、収集プロセス全体の設定を完了します。
CRD を使用した設定 (Kubernetes 用)
Container Service for Kubernetes (ACK) または自己管理の Kubernetes クラスターでは、AliyunLog カスタムリソース定義 (CRD) を使用してナノ秒精度のタイムスタンプ収集を設定できます。以下は、3 つの異なるプラグインの構成例です。
時間解析
apiVersion: telemetry.alibabacloud.com/v1alpha1
kind: ClusterAliyunPipelineConfig
metadata:
name: ${your-config-name}
spec:
config:
aggregators: []
global:
EnableTimestampNanosecond: true
inputs:
- Type: input_file
FilePaths:
- /test/sls/json_nano.log
MaxDirSearchDepth: 0
FileEncoding: utf8
EnableContainerDiscovery: true
processors:
- Type: processor_parse_json_native
SourceKey: content
- Type: processor_parse_timestamp_native
SourceKey: asctime
SourceFormat: '%Y-%m-%d %H:%M:%S,%f'
flushers:
- Type: flusher_sls
Logstore: ${your-logstore-name}
sample: |-
{
"asctime": "2025-11-03 15:39:14,229939478",
"filename": "log_generator.sh",
"levelname": "INFO",
"lineno": 204,
"module": "log_generator",
"message": "{\"no\": 45, \"inner_loop\": 15, \"loop\": 1697, \"uuid\": \"80366fca-a57d-b65a-be07-2ac1173505d9\"}",
"threadName": "MainThread"
}
project:
name: ${your-project-name}
logstores:
- name: ${your-logstore-name}ログ時間の抽出 (strptime 形式)
apiVersion: telemetry.alibabacloud.com/v1alpha1
kind: ClusterAliyunPipelineConfig
metadata:
name: ${your-config-name}
spec:
config:
aggregators: []
global:
EnableTimestampNanosecond: true
inputs:
- Type: input_file
FilePaths:
- /test/sls/json_nano.log
MaxDirSearchDepth: 0
FileEncoding: utf8
EnableContainerDiscovery: true
processors:
- Type: processor_parse_json_native
SourceKey: content
- Type: processor_strptime
SourceKey: asctime
Format: '%Y-%m-%d %H:%M:%S,%f'
KeepSource: true
AlarmIfFail: true
AdjustUTCOffset: false
flushers:
- Type: flusher_sls
Logstore: ${your-logstore-name}
sample: |-
{
"asctime": "2025-11-03 15:39:14,229939478",
"filename": "log_generator.sh",
"levelname": "INFO",
"lineno": 204,
"module": "log_generator",
"message": "{\"no\": 45, \"inner_loop\": 15, \"loop\": 1697, \"uuid\": \"80366fca-a57d-b65a-be07-2ac1173505d9\"}",
"threadName": "MainThread"
}
project:
name: ${your-project-name}
logstores:
- name: ${your-logstore-name}ログ時間の抽出 (Go 言語形式)
apiVersion: telemetry.alibabacloud.com/v1alpha1
kind: ClusterAliyunPipelineConfig
metadata:
name: ${your-config-name}
spec:
config:
aggregators: []
global:
EnableTimestampNanosecond: true
inputs:
- Type: input_file
FilePaths:
- /test/sls/json_nano.log
MaxDirSearchDepth: 0
FileEncoding: utf8
EnableContainerDiscovery: true
processors:
- Type: processor_parse_json_native
SourceKey: content
- Type: processor_gotime
SourceKey: asctime
SourceFormat: '2006-01-02 15:04:05,999999999'
DestKey: result_asctime
DestFormat: '2006-01-02 15:04:05,999999999Z07:00'
SetTime: true
KeepSource: true
NoKeyError: true
AlarmIfFail: true
flushers:
- Type: flusher_sls
Logstore: ${your-logstore-name}
sample: |-
{
"asctime": "2025-11-03 15:39:14,229939478",
"filename": "log_generator.sh",
"levelname": "INFO",
"lineno": 204,
"module": "log_generator",
"message": "{\"no\": 45, \"inner_loop\": 15, \"loop\": 1697, \"uuid\": \"80366fca-a57d-b65a-be07-2ac1173505d9\"}",
"threadName": "MainThread"
}
project:
name: ${your-project-name}
logstores:
- name: ${your-logstore-name}ステップ 4: 結果の検証
設定が完了したら、新しいログデータが Logstore に収集されるまでしばらく待ちます。
Log Service コンソールのクエリと分析ページで、収集されたログを表示します。コンソールは高精度時間情報を自動的に最適化して表示し、ミリ秒、マイクロ秒、またはナノ秒形式で表示します。

FAQ
Logtail がナノ秒タイムスタンプの解析に失敗するのはなぜですか?
Logtail でナノ秒精度の収集を有効にした後、タイムスタンプが正しく解析されず、ログの時間値が無効になることがあります。

原因
この問題は、ほとんどの場合、Logtail 構成の時間フォーマット文字列とログ内の実際のタイムスタンプフォーマットの不一致が原因です。フォーマットは、秒と小数部の間の区切り文字 (例: コンマ
,) を含め、完全に一致する必要があります。解決策
これを修正するには、エラーを診断し、Logtail 構成の時間フォーマット文字列を修正する必要があります。
ステップ 1: 解析エラーの診断
まず、Logtail プラグインログを確認して解析エラーを確認します。サーバーに SSH で接続し、
/usr/local/ilogtail/logtail_plugin.LOGファイルでSTRPTIME_PARSE_ALARMメッセージを確認します。tail -f /usr/local/ilogtail/logtail_plugin.LOG 以下のエラーはフォーマットの不一致を示します。ステップ 2: 時間フォーマット文字列の修正
収集構成の時間フォーマット文字列を更新して、ログのタイムスタンプと完全に一致させます。
2023-10-26 00:30:10,199999999のようにコンマ区切り文字を使用するタイムスタンプの場合、修正は次のようになります。不正なフォーマット:
%Y-%m-%d %H:%M:%S %f(区切り文字としてスペースを使用)正しいフォーマット:
%Y-%m-%d %H:%M:%S,%f(区切り文字としてコンマを使用)
この変更を時間解析プラグインの設定に適用します。
コストと制限
コストへの影響:
time_ns_partフィールドはログコンテンツの一部として保存されるため、生ログのストレージサイズがわずかに増加します。環境の制限: これは Linux 上の Logtail 1.8.0 以降のバージョンでのみ利用可能です。Windows では効果がありません。
関連ドキュメント
付録 1: 一般的なログ時間フォーマット
Linux では、Logtail は strftime 関数が提供するすべての時間フォーマットをサポートしています。
フォーマット | 説明 | 例 |
%a | 曜日の省略名。 | Fri |
%A | 曜日の完全名。 | Friday |
%b | 月の省略名。 | Jan |
%B | 月の完全名。 | January |
%d | 月の日をゼロ埋めした 10 進数 (01-31)。 | 07, 31 |
%f | 秒の小数部 (ミリ秒、マイクロ秒、またはナノ秒)。 | 123 |
%h | 月の省略名、%b と同じ。 | Jan |
%H | 時 (24 時間表記) を 10 進数で表したもの。 | 22 |
%I | 時 (12 時間表記) を 10 進数で表したもの。 | 11 |
%m | 月をゼロ埋めした 10 進数 (01-12)。 | 08 |
%M | 分をゼロ埋めした 10 進数 (00-59)。 | 59 |
%n | 改行文字。 | 改行文字 |
%p | ロケールの AM または PM に相当するもの。 | AM, PM |
%r | ロケールの 12 時間表記の時間、%I:%M:%S %p と同じ。 | 11:59:59 AM |
%R | 時と分、%H:%M と同じ。 | 23:59 |
%S | 秒をゼロ埋めした 10 進数 (00-59)。 | 59 |
%t | タブ文字。 | なし |
%y | 世紀を含まない年をゼロ埋めした 10 進数 (00-99)。 | 04, 98 |
%Y | 世紀を含む年を 10 進数で表したもの。 | 2004, 1998 |
%C | 世紀を 10 進数で表したもの (00-99)。 | 16 |
%e | 月の日をスペース埋めした 10 進数 ( 1-31)。 1 桁の数字には先頭にスペースが使用されます。 | 7, 31 |
%j | 年の日をゼロ埋めした 10 進数 (001-366)。 | 365 |
%u | 曜日を 10 進数で表したもの (1-7)、1 は月曜日。 | 2 |
%U | 年の週番号 (00-53)、日曜を週の最初の日とする。 | 23 |
%V | ISO 8601 の年の週番号 (01-53)、月曜を週の最初の日とする。 1 月 1 日を含む週が新年に 4 日以上ある場合は第 1 週とし、そうでない場合は前年の週とし、次の週を第 1 週とします。 | 24 |
%w | 曜日を 10 進数で表したもの (0-6)、0 は日曜日。 | 5 |
%W | 年の週番号 (00-53)、月曜を週の最初の日とする。 | 23 |
%c | 標準の日付と時刻の文字列。 | Tue Nov 20 14:12:58 2020 |
%x | 時刻を含まない標準の日付文字列。 | Tue Nov 20 2020 |
%X | 日付を含まない標準の時刻文字列。 | 11:59:59 |
%s | Unix タイムスタンプ。 | 1476187251 |
時間フォーマットの例
次の表は、一般的な時間標準、例、およびそれに対応する時間式を示しています。
例 | 時間式 | 時間標準 |
2017-12-11 15:05:07 | %Y-%m-%d %H:%M:%S | カスタム |
[2017-12-11 15:05:07.012] | [%Y-%m-%d %H:%M:%S.%f] | カスタム |
2017-12-11 15:05:07.123 | %Y-%m-%d %H:%M:%S.%f | カスタム |
02 Jan 06 15:04 MST | %d %b %y %H:%M | RFC822 |
02 Jan 06 15:04 -0700 | %d %b %y %H:%M | RFC822Z |
Monday, 02-Jan-06 15:04:05 MST | %A, %d-%b-%y %H:%M:%S | RFC850 |
Mon, 02 Jan 2006 15:04:05 MST | %a, %d %b %Y %H:%M:%S %Z | RFC1123 |
2006-01-02T15:04:05Z | %Y-%m-%dT%H:%M:%SZ | RFC3339 |
2006-01-02T15:04:05.999999999Z | %Y-%m-%dT%H:%M:%S.%fZ | RFC3339Nano |
1637843406 | %s | カスタム |
1637843406123 | %s | カスタム (Simple Log Service は秒レベルの精度で処理します) |
付録 2: Go 言語の時間フォーマット
以下は、Go 標準ライブラリの時間フォーマットの例です。
const (
Layout = "01/02 03:04:05PM '06 -0700" // The reference time, in numerical order.
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM" // Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)