Skip to content

Logging ja JP

ArchiBot edited this page Jun 2, 2026 · 35 revisions

ロギング

ASFでは、ランタイム中に使用する独自のカスタムロギングモジュールを設定できます。 アプリケーションのディレクトリに NLog.config という名前の特別なファイルを入れることで行うことができます。 NLog のドキュメント全体は NLog Wiki で読むことができますが、ここにも役立つ例がいくつかあります。


既定のログ

デフォルトでは、ASFは ColoredConsole (標準出力) と File にロギングされています。 `` ロギングには log.txt ファイルがプログラムのディレクトリに含まれ、アーカイブの目的で `logs` ディレクトリが含まれます。

カスタム NLog 設定を使用すると、ASF のデフォルト設定は自動的に無効になります。あなたの設定は ASF のデフォルトロギングを完全に上書きするため、たとえば私たちの ColoredConsole ターゲットを保持したい場合は、それを自分で定義する必要があります。 これにより、 追加の ロギングターゲットを追加するだけでなく、 デフォルトの ものを無効にしたり変更したりすることができます。

ASF のデフォルトロギングをそのまま使用したい場合は、何もする必要はありません。カスタム NLog.config に定義する必要もありません。 ただし、参照として、ハードコーディングされたASFデフォルトロギングと同等のものは以下のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${onexception:inner= ${exception:format=toString,Data}}" />
    <target xsi:type="File" name="File" archiveFileName="${currentdir:cached=true}/logs/log.txt" archiveOldFileOnStartup="true" archiveSuffixFormat=".{1:yyyyMMdd-HHmmss}" fileName="${currentdir:cached=true}/log.txt" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${onexception:inner= ${exception:format=toString,Data}}" maxArchiveFiles="10" />

    <!-- 以下は ASF の IPCインターフェースが開始されると有効になります -->
    <target type="History" name="History" layout="${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${onexception:inner= ${exception:format=toString,Data}}" maxCount="20" />
  </targets>

  <rules>
    <!-- 以下のエントリは ASP.NET (IPC) ロギングを指定します。最後の Debug catch-all に ASP.NET ログがデフォルトで含まれないようにするため、これらを宣言しています -->
    <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" writeTo="ColoredConsole" />
    <logger name="Microsoft.*" finalMinLevel="Warn" writeTo="ColoredConsole" />
    <logger name="System.*" finalMinLevel="Warn" writeTo="ColoredConsole" />

    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />

    <!-- 以下のエントリは ASP.NET (IPC) ロギングを指定します。最後の Debug catch-all に ASP.NET ログがデフォルトで含まれないようにするため、これらを宣言しています -->
    <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" writeTo="File" />
    <logger name="Microsoft.*" finalMinLevel="Warn" writeTo="File" />
    <logger name="System.*" finalMinLevel="Warn" writeTo="File" />

    <logger name="*" minlevel="Debug" writeTo="File" />

    <!-- 以下は ASF の IPCインターフェースが有効になると有効になります -->
    <!-- 以下のエントリは ASP.NET (IPC) ロギングを指定します。最後の Debug catch-all に ASP.NET ログがデフォルトで含まれないようにするため、これらを宣言しています -->
    <logger name="Microsoft.Hosting.Lifetime" finalMinLevel="Info" writeTo="History" />
    <logger name="Microsoft.*" finalMinLevel="Warn" writeTo="History" />
    <logger name="System.*" finalMinLevel="Warn" writeTo="History" />

    <logger name="*" minlevel="Debug" writeTo="History" />
  </rules>
</nlog>

ASF統合

ASFにはNLogとの統合を強化する素晴らしいコードトリックが含まれており、特定のメッセージをより簡単にキャッチできます。

NLog 固有の ${logger} 変数は、常にメッセージの発生元を区別します。これは、いずれかのボットの BotName か、メッセージが ASF プロセスから直接送られた場合は ASF になります。 この方法により、ロガー名に基づいて、すべてのメッセージではなく、特定のボットまたは ASF プロセスのみのメッセージを簡単にキャッチできます。

ASFは、NLogが提供するロギングレベルに基づいて適切にメッセージをマークしようとします。 特定のログレベルからのメッセージのみをキャッチすることが可能になります もちろん、特定のメッセージのロギングレベルをカスタマイズすることはできません。ASFハードコードされたメッセージの深刻度を決めるためです。 しかし、あなたが適合しているように、確実にASFを少なく/より静かにすることができます。

ASFは、 トレース ロギングレベルのユーザー/チャットメッセージなどの追加情報を記録します。 デフォルトのASFロギングログのみ `` レベル以上をデバッグし、追加情報を非表示にします。 大多数のユーザーには必要ないため、さらに重要なメッセージを含むクラッタ出力も必要としません。 しかし、 Trace のロギングレベルを再度有効にすることで、その情報を利用することができます。 特に特定のボットをログに記録するのと組み合わせると あなたが興味を持っている特定のイベントに

一般的に、ASFはできるだけ簡単で便利なものにしようとしています。 grep などのサードパーティツールを使用して手動でフィルタリングするのではなく、必要なメッセージのみをログに記録することができます。 以下に書かれているように NLog を適切に設定してください 非常に複雑なロギングルールをデータベース全体などのカスタムターゲットで指定できるはずです

バージョン管理について - ASFは、ASFリリース時に NuGet で利用可能な最新バージョンのNLogを常に出荷しようとしています。 NLog Wiki で見つかる機能は、ASF で使用しても問題ないはずです。ただし、ASF も最新のものを使用していることを確認してください。

ASF統合の一環として、ASFには追加のASF NLogロギングターゲットのサポートも含まれています。


以下の例では、好みに合わせてログをカスタマイズする方法を示します。

手始めに、ColoredConsole ターゲットのみを使用します。 最初の NLog.config は次のようになります。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
  </rules>
</nlog>

上記の設定の説明は比較的簡単です。まず ロギングターゲット を 1 つ定義します。これは ColoredConsole です。次に、Debug 以上のレベルの すべてのロガー*)を、先ほど定義した ColoredConsole ターゲットへリダイレクトします。

上記の NLog.config で ASF を起動すると、現在は ColoredConsole ターゲットのみが有効になり、ハードコードされた ASF の NLog 設定に関係なく、ASF は File へ書き込みません。

layout など、多くのプロパティを定義していなかったため、デフォルトの組み込み値で初期化されました。この場合は ${longdate}|${level:uppercase=true}|${logger}|${message} です。 以下のようにカスタマイズできます: メッセージのみをログに記録する:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" layout="${message}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
  </rules>
</nlog>

今ASFを起動すると、その日付がわかります。 レベルとロガー名が消えました - Function() Message の形式でASFメッセージのみを残します。

複数のターゲットにログを記録する設定を変更することもできます。 ColoredConsoleファイル を同時にログに記録しましょう。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="File" fileName="${currentdir:cached=true}/NLog.txt" deleteOldFileOnStartup="true" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
    <logger name="*" minlevel="Debug" writeTo="File" />
  </rules>
</nlog>

これで、 ColoredConsole および ファイル にすべてのデータを記録します。 カスタム fileName と追加オプションを指定することもできます。

最後に、ASF はさまざまなログレベルを使用して、何が起こっているのかを理解しやすくしています。この情報を利用して、ログの重大度を調整できます。 この情報を使用して重大度ログを修正できます。 たとえば、すべて(Trace)を File にログ出力し、Warning 以上の ログレベル のみを ColoredConsole に出力したいとします。 これは rules を変更することで実現できます:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="File" fileName="${currentdir:cached=true}/NLog.txt" deleteOldFileOnStartup="true" />
  </targets>

  <rules>
    <logger name="*" minlevel="Warn" writeTo="ColoredConsole" />
    <logger name="*" minlevel="Trace" writeTo="File" />
  </rules>
</nlog>

これで、 ColoredConsole は警告のみを表示し、すべてを ファイル に記録します。 これをさらに微調整してログを記録することができます。例えば、 情報 以下などです。

最後に、もう少し高度なことを行い、すべてのメッセージをファイルにログしましょう。ただし、 LogBot という名前のボットからだけです。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="LogBotFile" fileName="${currentdir:cached=true}/LogBot.txt" deleteOldFileOnStartup="true" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
    <logger name="LogBot" minlevel="Trace" writeTo="LogBotFile" />
  </rules>
</nlog>

上記のASF統合をどのように使用したか、 ${logger} プロパティに基づいてメッセージのソースを簡単に区別できます。


高度な使い方

上記の例は簡単で、ASFで使用できる独自のロギングルールを定義するのがいかに簡単かを示しています。 NLog はさまざまな用途に使用できます。たとえば、複雑なターゲット(Database にログを保存するなど)、ログローテーション(古い File ログを削除するなど)、カスタム Layout の使用、独自の <when> ロギングフィルターの宣言など、さらに多くのことが可能です。 NLog ドキュメント 全体を読んで、利用可能なすべてのオプションについて学ぶことをお勧めします。 あなたが望むようにASFロギングモジュールを微調整することができます。 これは非常に強力なツールであり、ASFロギングのカスタマイズは決して容易ではありませんでした。


制限事項

ASF はユーザー入力を待っている間、すべてのルールのうち、ColoredConsole または Console ターゲットを含むものを一時的に無効にします。 したがって、ASF がユーザー入力を待っている間も他のターゲットへのロギングを続けたい場合は、上記の例に示すように、それらのターゲットを独自のルールで定義する必要があります。同じルールの writeTo に複数のターゲットを入れるのではなく、個別に定義してください(それが意図した動作である場合を除きます)。 ユーザー入力を待っているときにコンソールをきれいに保つため、一時的にコンソールターゲットを無効にします。


チャットログ

ASFには、 トレース ロギングレベルですべての受信/送信メッセージを記録するだけでなく、チャットロギングの拡張サポートが含まれています。 しかし、 イベントプロパティ で、関連する追加情報を公開します。。 これは、チャットメッセージをコマンドとして扱う必要があるためです。 したがって、追加のロジックを追加できるようにするために、これらのイベントを記録するのに費用はかかりません(ASFを個人的なSteamチャットアーカイブにするなど)。

イベントのプロパティ

名前 説明
Echo bool 型. メッセージが受信者に送信されている場合は、これは true に設定され、それ以外の場合は false に設定されます。
メッセージ 文字列 型。 これは実際の送信/受信メッセージです。
チャットグループID ulong type. これは、送信/受信メッセージのグループ チャットの ID です。 このメッセージの送信にグループ チャットが使用されていない場合、 0 0 になります。
チャットID ulong type. これは、送信/受信メッセージの ChatGroupID チャンネルの ID です。 このメッセージの送信にグループ チャットが使用されていない場合、 0 0 になります。
SteamID ulong type. これは、送信/受信メッセージの Steam ユーザーのIDです。 特定のユーザーがメッセージ送信に関与していない場合、 0 0 にすることができます (e. を選択します。

この例は、上記の ColoredConsole の基本的な例に基づいています。 理解しようとする前に 最初にNLogのログ記録の基本について学ぶには、 の上を見てみることを強くお勧めします。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target xsi:type="ColoredConsole" name="ColoredConsole" />
    <target xsi:type="File" name="ChatLogFile" fileName="${currentdir:cached=true}/logs/chat/${event-properties:item=ChatGroupID}-${event-properties:item=ChatID}${when:when='${event-properties:item=ChatGroupID}' == 0:inner=-${event-properties:item=SteamID}}.txt" layout="${date:format=yyyy-MM-dd HH\:mm\:ss} ${event-properties:item=Message} ${when:when='${event-properties:item=Echo}' == true:inner=-&gt;:else=&lt;-} ${event-properties:item=SteamID}" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="ColoredConsole" />
    <logger name="MainAccount" level="Trace" writeTo="ChatLogFile">
      <filters defaultAction="Log">
        <when condition="not starts-with('${message}','OnIncoming') and not starts-with('${message}','SendMessage')" action="Ignore" />
      </filters>
    </logger>
  </rules>
</nlog>

基本的な ColoredConsole の例から始め、さらに拡張しました。 何よりも 各グループチャンネルとSteamユーザーごとに恒久的なチャットログファイルを用意しました。ASFが私たちに見せてくれる追加プロパティのおかげで可能になります。 また、現在の日付、メッセージ、sent/received info、Steamユーザー自身を書き込むカスタムレイアウトにも対応することにしました。 最後に、チャットログ用のルールは、Trace レベル、MainAccount ボット、そしてチャットログに関連する関数に対してのみ有効にしました(メッセージとエコーの受信に使用される OnIncoming*、および ASF がメッセージを送信するための SendMessage*)。

上記の例では、logs/chat/0-0-76561198069026042.txt ファイルが生成されます。これは ArchiBot と会話するときのものです:

2018-07-26 01:38:38 元気ですか? -> 76561198069026042
2018-07-26 01:38:38 素晴らしいことをしています。あなたはどうですか? <- 76561198069026042

もちろん、これは実用的な方法で示されたいくつかの素晴らしいレイアウトのトリックを使用した作業例です。 追加のフィルタリング、カスタム注文、個人的なレイアウト、受信したメッセージのみの記録など、このアイデアを自分のニーズにさらに拡張できます。

別の例

これは、 archi という名前のボットが寄付取引を受けたときにメインボットのsteamID (76561198006963719)にメッセージを送信するために、 SteamTarget を使用します。 このプロセスには別のボットが必要です(自分自身にメッセージを送信できないため)。

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target type="Steam" name="Steam" steamID="76561198006963719" />
  </targets>

  <rules>
    <logger name="archi" level="Trace" writeTo="Steam">
      <filters defaultAction="Ignore">
        <when condition="starts-with('${message}','ParseTrade() Accepted donation trade: ')" action="Log" />
      </filters>
    </logger>
  </rules>
</nlog>

ASFターゲット

標準の NLog ロギングターゲットに加えて、 (上で説明する ColoredConsoleファイル など) カスタムASFロギングターゲットを使用することもできます。

最大限の完成度を得るために、ASFターゲットの定義はNLog文書化条約に従います。


SteamTarget

推測できるように、このターゲットはASFメッセージをログに記録するためにSteamチャットメッセージを使用します。 グループ チャットまたはプライベート チャットのいずれかを使用するように設定できます。 メッセージのSteamターゲットを指定することに加えて、 これらを送信するボットの botName を指定することもできます。

ASFが使用するすべての環境でサポートされています。


設定構文

<targets>
  <target type="Steam"
          name="String"
          layout="Layout"
          chatGroupID="Ulong"
          steamID="Ulong"
          botName="Layout" />
</targets>

設定ファイル の使用方法の詳細をご覧ください。


パラメータ

全般オプション

name - ターゲットの名前。


レイアウトオプション

layout - レンダリングされるテキスト。 レイアウトが必要です。 デフォルト: ${level:uppercase=true}|${logger}|${message}


SteamTarget オプション

chatGroupID - 64ビットの符号なし整数として宣言されたグループチャットのID。 必須ではありません。 デフォルトは 0 0 で、グループチャット機能を無効にし、代わりにプライベートチャットを使用します。 有効な場合 (ゼロ以外の値に設定) steamID プロパティは chatID として機能し、ボットがメッセージを送信する必要がある chatGroupID 内のチャンネルの ID を指定します。

steamID - 対象の Steam ユーザーの 64 ビット長符号なし整数として宣言された SteamID(SteamOwnerID など)、または対象の chatIDchatGroupID が設定されている場合)。 必須です。 デフォルトは 0 で、ロギングターゲットを完全に無効にします。

botName - 上記で宣言した steamID にメッセージを送信する (ASFによって認識されているように、大文字と小文字を区別します)。 必須ではありません。 デフォルトは null で、現在接続されているボットのうち任意のものが自動的に選択されます。 SteamTarget は Steam の多くの制限を考慮しないため、この値は適切に設定することをおすすめします。たとえば、対象の steamID がフレンドリストに入っている必要がある、といった制限があります。 この変数は layout 型として定義されているため、メッセージを生成したボットを使用するために ${logger} などの特殊な構文を使用できます。


SteamTarget の例

MyBot という名前のボットから、steamID 76561198006963719 宛てに送られる Debug 以上のレベルのすべてのメッセージを書き込むには、以下のような NLog.config を使用してください:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="https://nlog-project.org/schemas/NLog.xsd" xsi:schemaLocation="NLog NLog.xsd" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance">
  <targets>
    <target type="Steam" name="Steam" steamID="76561198006963719" botName="MyBot" />
  </targets>

  <rules>
    <logger name="*" minlevel="Debug" writeTo="Steam" />
  </rules>
</nlog>

注意: SteamTarget は ASF 独自のターゲットです。そのため、xsi:type="Steam" ではなく、必ず type="Steam" として宣言してください。xsi は NLog がサポートする公式ターゲット用に予約されています。

上記と同様の NLog.config で ASF を起動すると、MyBot は通常の ASF ログメッセージをすべて、Steam ユーザー 76561198006963719 へ送信し始めます。 メッセージを送信するには、 MyBot が接続されている必要があります。 したがって、ボットがSteamネットワークに接続する前に発生したすべての最初のASFメッセージは転送されません。

もちろん、 SteamTarget には、一般的な TargetWithLayoutから期待できるすべての典型的な関数があります。 eと組み合わせて使うことができます を選択します。 上記の例は、最も基本的な例にすぎません。


スクリーンショット

スクリーンショット


注意

`` ロギングレベルを SteamTarget と ASFプロセスに参加している `steamID` を組み合わせるときは注意してください。 これは、潜在的な `StackOverflowException` につながる可能性があります。なぜなら、与えられたメッセージを受け取るASFの無限ループを作成するからです。 Steam経由でログを記録し、別のメッセージを記録する必要があります。 現在これが起こり得るのは、`Trace` レベルでログを記録する場合(ここでは ASF 自身のチャットメッセージが記録されます)、または ASF を `Debug` モードで実行しながら `Debug` レベルでログを記録する場合(ここではすべての Steam パケットが記録されます)だけです。

要するに、あなたの steamID が同じ ASF プロセスに参加している場合、SteamTargetminlevel ログレベルは Info 以上にするべきです(ASF を Debug モードで実行していない場合は Debug 以上でも構いません)。 あるいは、無限のロギングループを避けるために、独自の <when> ロギングフィルターを定義することもできます。 あなたのケースに適切なレベルを変更する場合 この警告は、グループチャットにも適用されます。


HistoryTarget

このターゲットは、 /Api/NLog エンドポイント ASF API で固定サイズのロギング履歴を提供するため、ASF-uiやその他のツールで使用できます。 一般的に、他のカスタマイズにカスタムNLog設定を使用している場合にのみ、このターゲットを定義する必要があります。また、ASF APIでログを公開したい場合に限ります。 ASF-ui用 保存されるメッセージのデフォルトレイアウトや maxCount を変更したい場合にも宣言できます。

ASFが使用するすべての環境でサポートされています。


設定構文

<targets>
  <target type="History"
          name="String"
          layout="Layout"
          maxCount="Byte" />
</targets>

設定ファイル の使用方法の詳細をご覧ください。


パラメータ

全般オプション

name - ターゲットの名前。


レイアウトオプション

layout - レンダリングされるテキスト。 レイアウトが必要です。 デフォルト: ${date:format=yyyy-MM-dd HH\:mm\:ss}|${processname}-${processid}|${level:uppercase=true}|${logger}|${message}${exception:inner= ${exception:format=toString,Data}}


HistoryTarget オプション

maxCount - オンデマンド履歴の最大ログ量。 必須ではありません。 デフォルトは 20 で、初期履歴を提供するための良いバランスです。 記憶装置の要件から生じるメモリ使用量を念頭に置いています 0 0 より大きくなければなりません。

Clone this wiki locally