ステップ 1: nuget log4net パッケージをインストールする
ステップ 2: 新しい log4net.config 構成ファイルを作成し、ログ出力形式を構成する
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections>
<appSettings>
<add key="WebSocketPort" value="45154" />
</appSettings>
<log4net>
<!--指定日记记录方式,以滚动文件的方式(文件记录)-->
<appender name="logInfoToFile" type="log4net.Appender.RollingFileAppender,log4net">
<!--日志路径-->
<file value="logs/log4net/info"/>
<!--是否是向文件中追加日志-->
<AppendToFile value="true"/>
<!--日志根据日期滚动-->
<RollingStyle value="Date"/>
<!--日志文件名格式为:info.2021-12-30.txt-->
<DatePattern value="'.'yyyy-MM-dd'.txt'"/>
<!--日志文件名是否是固定不变的-->
<StaticLogFileName value="false"/>
<!--布局-->
<layout type="log4net.Layout.PatternLayout,log4net">
<ConversionPattern value="%d %-5p [%c] %m%n"/>
</layout>
</appender>
<appender name="logErrorToFile" type="log4net.Appender.RollingFileAppender,log4net">
<file value="logs/log4net/error"/>
<AppendToFile value="true"/>
<RollingStyle value="Date"/>
<!--日志文件名格式为:error.2021-12-30.txt-->
<DatePattern value="'.'yyyy-MM-dd'.txt'"/>
<StaticLogFileName value="false"/>
<layout type="log4net.Layout.PatternLayout,log4net">
<ConversionPattern value="%d %-5p [%c] %m%n"/>
</layout>
</appender>
<!-- 根(父)logger -->
<root>
<!-- 支持级别:ALL -->
<level value="ALL" additivity="false"/>
<!-- ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF-->
<!-- 支持的appender名称:logInfoToFile -->
<appender-ref ref="logInfoToFile"/>
</root>
<!-- logger名称为ApplicationInfoLog,阻止父logger中的appender -->
<logger name="ApplicationInfoLog" additivity="false">
<!-- 支持级别:ALL -->
<level value="ALL"/>
<!-- 支持的appender名称:logInfoToFile -->
<appender-ref ref="logInfoToFile"/>
</logger>
<logger name="ApplicationErrorLog" additivity="false">
<!-- 支持级别:ALL -->
<level value="ALL"/>
<!-- 支持的appender名称:logErrorToFile -->
<appender-ref ref="logErrorToFile"/>
</logger>
</log4net>
</configuration>
または、次のコードをプロジェクトの .csproj ファイルに追加します。
<ItemGroup>
<Content Update="log4net.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
3 番目のステップのコントローラー コードの内容
[ApiController]
[Route("[controller]/[action]")]
public class HomeController : Controller
{
private readonly ILogger<HomeController> _logger;
public HomeController(ILogger <HomeController> logger)
{
_logger = logger;
}
[HttpGet]
/// <summary>
/// 获取日志输出
/// </summary>
/// <returns></returns>
public void GetLogOnUniversalHost()
{
ILoggerRepository repository = LogManager.CreateRepository(".NET Core RepositoryRepository");
XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));
ILog log = LogManager.GetLogger(repository.Name, ".NET Core Log4net");
log.Info(".NET Core Log4net log1");
log.Info("test log1");
log.Error("error1");
log.Info("linezero1");
}
ステップ 4: スタートアップ項目にログ構成を追加してデフォルトのログプロバイダーを置き換え、コントローラーに特定の出力コンテンツを書き込みます
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args).ConfigureLogging(logging => // 添加提供程序(通用主机)
{
logging.ClearProviders(); // 去掉默认添加的日志提供程序
logging.AddConsole();
logging.AddDebug();
logging.AddEventSourceLogger();
logging.AddEventLog();
}).ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup < Startup > ();
});
走った後
ステップ 5: ロガーノード構成の詳細な説明
1: Log4Net 構造
Log4net は主に、Logger、Appender、Filter、Layout、Object Render の 5 つのコア コンポーネントに分かれています。
2: ロガーの概要
Logger はログを担当するレコーダーです。通常の実行時ログと例外発生時のエラー ログを記録する必要があると仮定すると、構成ファイルに 2 つの Logger を追加することでこれを実現できます。Logger は主にログを分類し、ログ レベルを制御するために使用されます。さまざまな形式でログ情報を出力でき、ログの出力レベルも制御できます。
log4net は継承システムを使用します。つまり、ロガーが 2 つある場合、それらの名前は abc と ab になります。すると、ab は abc の祖先になります。各ロガーは、その祖先のプロパティを継承します。
3: アペンダーの概要
Appender は記録メディアを提供しており、コンソール、テキスト ファイル、データベースを含む Windows ログ イベント ビューア、電子メールなどにログを出力することができます。
これは、Appender 構成を通じて実現できます。Log4Net は、デフォルトで一般的に使用される Appender をいくつか提供しています。いくつかの構成ファイルを変更するだけで、データベースとファイルに同時に書き込む機能を実現できます。
4: フィルターの紹介
Filter はフィルタで、Appender が出力した内容の一部をフィルタリングして、必要なログのみを出力することができます。
5:レイアウトの紹介
レイアウトは、アペンダーの出力形式 (線形または XML) を制御するために使用されます。アペンダーはレイアウト構成を 1 つだけ持つことができます。
6: オブジェクト レンダーの概要
Object Render は、オブジェクトを文字列に変換してログに記録する方法をロガーに指示します。ILog で定義されたログ メソッドによって受け取られるパラメータは、文字列ではなくオブジェクトです。
たとえば、Orange オブジェクトをログに記録したいとします。ただし、この時点では、ロガーは Orange のデフォルトの ToString メソッドのみを呼び出します。したがって、log4net.ObjectRender.IObjectRender インターフェイスを実装する OrangeRender クラスを定義し、登録します。この時点で、ロガーは Orange をログに記録する方法を認識します。
7: ロガーノードの構成
name は必須です。コード内で ILog オブジェクトを取得するときに使用されるロガーの名前です。
additivity はオプションで、値は true または false で、デフォルト値は true です。false に設定すると、親ロガーのアペンダーがブロックされます。
ロガーによってサポートされるサブ要素: level、appender-ref、param。
レベルは最大でも 1 です。このレベル以上のもののみが記録されます。OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL
appender-ref 0 以上、引用符で囲まれるアペンダーの名前。
param 0以上の場合は、いくつかのパラメータを設定します。
8: ログレベルレベル
高到底分别为:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL
9: ILog オブジェクトの説明
ILog は Logger を実装するインターフェイスであり、さまざまなログ レベルでログを記録するための 5 つのメソッド (Debug、Inof、Warn、Error、Fatal) が定義されています。これら 5 つのメソッドにはそれぞれ 1 つのオーバーロードがあります。例として Debug を取り上げます。他のメソッドも同様です。
ILog の Debug メソッドの定義は次のとおりです。
void Debug(object message);
void Debug(object message, Exception exception);
ブール値プロパティもあります:
bool IsDebugEnabled { get; }
Debug(オブジェクト メッセージ、例外例外) を使用すると、レイアウトの構成に関係なく、例外メッセージやトレースを含む例外情報がログに出力されます。Debug(オブジェクトメッセージ)を使用すると、レイアウトがどのように設定されても例外メッセージは出力されません。
コードでは、LogManager クラスを使用して、Logger 構成で対応する ILog オブジェクトを取得できます。LogManager クラスは、適切な Logger を管理するために使用されます。その GetLogger 静的メソッドは、構成ファイル内の対応する Logger を取得できます。コードは次のとおりです。以下に続きます:
ILog ログ = LogManager.GetLogger(“ロガー名”)
10: アペンダーノード構成の詳細説明
1: アペンダーノードの構成
サポートされる属性: name、type (name 属性は一意である必要があり、type 属性は指定する必要があります)。
name 必須、アペンダー オブジェクトの名前
type 必須、アペンダー オブジェクトの出力タイプ
よく使用されるサブ要素: appender-ref、filter、layout、param
0 個以上の appender-ref により、このアペンダーが他のアペンダーを参照できるようになります。すべてのアペンダー タイプがサポートしているわけではありません。
filter 0 以上。このアペンダーで使用されるフィルターを定義します。
ayout は最大でも 1 つです。アペンダーによって使用される出力形式を定義します。
Param 0以上の場合、Appenderクラスの対応する属性の値を設定します。
2:Appenderの出力方法(type属性)
AdoNetAppender 将日志记录到数据库中。可以采用SQL和存储过程两种方式。
AnsiColorTerminalAppender 将日志高亮输出到ANSI终端。
AspNetTraceAppender 能用asp.net中Trace的方式查看记录的日志。
BufferingForwardingAppender 在输出到子Appenders之前先缓存日志事件。
ConsoleAppender 将日志输出到应用程序控制台。
EventLogAppender 将日志写到Windows Event Log。
FileAppender 将日志输出到文件。
ForwardingAppender 发送日志事件到子Appenders。
LocalSyslogAppender 将日志写到local syslog service (仅用于UNIX环境下)。
MemoryAppender 将日志存到内存缓冲区。
NetSendAppender 将日志输出到Windows Messenger service.这些日志信息将在用户终端的对话框中显示。
OutputDebugStringAppender 将日志输出到Debuger,如果程序没有Debuger,就输出到系统Debuger。如果系统Debuger也不可用,将忽略消息。
RemoteSyslogAppender 通过UDP网络协议将日志写到Remote syslog service。
RemotingAppender 通过.NET Remoting将日志写到远程接收端。
RollingFileAppender 将日志以回滚文件的形式写到文件中。
SmtpAppender 将日志写到邮件中。
SmtpPickupDirAppender 将消息以文件的方式放入一个目录中,像IIS SMTP agent这样的SMTP代理就可以阅读或发送它们。
TelnetAppender 客户端通过Telnet来接受日志事件。
TraceAppender 将日志写到.NET trace 系统。
UdpAppender 将日志以无连接UDP数据报的形式送到远程宿主或用UdpClient的形式广播。
11: フィルターノード構成
filter は子要素としてのみ使用でき、type 属性はフィルターのタイプを示します。共通のサブ要素の数は 0 以上であり、その機能はいくつかのパラメータを設定することです。
1: フィルター タイプの説明 DenyAllFilter は、すべてのログ イベントの記録を防止します。
LevelMatchFilter 只有指定等级的日志事件才被记录
LevelRangeFilter 日志等级在指定范围内的事件才被记录
LoggerMatchFilter Logger名称匹配,才记录
PropertyFilter 消息匹配指定的属性值时才被记录
StringMathFilter 消息匹配指定的字符串才被记录
MdcFilter
NdcFilter
12: レイアウトノード構成の詳細説明
1: レイアウトノードの構成
レイアウト ノードは子要素としてのみ使用できます。type 属性は、レイアウトのタイプを示します。共通のサブ要素の数は 0 以上であり、その機能はいくつかのパラメータを設定することです。
Layout用于控制Appender的输出格式,可以使线性的也可以使XML。最常用的Layout应该是用户自定义格式的PatternLayout,其次是SimpleLayout和ExceptionLayout。然后还有4个Layout,其中有两个是输出Xml的Layout,但是中文会有问题。ExceptionLayout需要给Logger的方法传入Exception对象作为参数才起作用,否则就什么也不输出。输出的时候会包含Message和Trace。
2: レイアウトノードの type 属性の値
ExceptionLayout は、ログ イベント内の例外のテキスト情報のみをレンダリングします。
PatternLayout 可以通过类型字符串来配置的布局
RawPropertyLayout 从日志事件中提取属性值
RawTimeStampLayout 从日志事件中提取日期
RawUtcTimeStampLayout 从日志事件中提取UTC日期
SimpleLayout 很简单的布局
XmlLayout 把日志事件格式化为XML元素的布局
3: PatterLayoutのフォーマット文字列
%m、%message によって出力されたログ メッセージ
%d、%datetime 输出当前语句运行的时刻,格式%date{yyyy-MM-dd HH:mm:ss,fff}
%r、%timestamp 输出程序从运行到执行到当前语句时消耗的毫秒数
%p、%level 日志的当前优先级别
%c、%logger 当前日志对象的名称
%L、%line 输出语句所在的行号
%F、%file 输出语句所在的文件名,警告:只在调试的时候有效,调用本地信息会影响性能
%a、%appdomain 引发日志事件的应用程序域的名称。
%C、%class、%type 引发日志请求的类的全名,警告:会影响性能
%exception 异常信息
%u、%identity 当前活动用户的名字,我测试的时候%identity返回都是空的。警告:会影响性能
%l、%location 引发日志事件的名空间、类名、方法、行号。警告:会影响性能,依赖pdb文件
%M、%method 发生日志请求的方法名,警告:会影响性能
%n、%newline 换行符
%x、%ndc NDC(nested diagnostic context)
%X、%mdc、%P、%properties 等介于 %property
%property 输出{log4net:Identity=, log4net:UserName=, log4net:HostName=}
%t、%thread 引发日志事件的线程,如果没有线程名就使用线程号。
%w、%username 当前用户的WindowsIdentity,类似:HostName/Username。警告:会影响性能
%utcdate 发生日志事件的UTC时间。例如:%utcdate{HH:mm:ss,fff}
%% 输出一个百分号
4: PatterLayout フォーマット修飾子
フォーマット修飾子の配置 最小幅 最大幅 説明
%20logger 右对齐 20 无 如果logger名不足20个字符,就在左边补空格
%-20logger 左对齐 20 无 如果logger名不足20个字符,就在右边补空格
%.30logger 左对齐 无 30 超过30个字符将截断
%20.30logger 右对齐 20 30 logger名要在20到30之间,少了在左边补空格,多了截断
%-20.30logger 左对齐 20 30 logger名要在20到30之间,少了在右边补空格,多了截断
13: その他のノードの説明と構成
1: パラメータノード
要素は、名前、値、タイプなどの属性を含む、任意の要素の子要素にすることができます。name: 必須、値は親オブジェクトのパラメータ名です。value: オプション。value はパラメータ値に変換できる文字列です。type: オプション value と type のうち、1 つの属性を指定する必要があります。type は型名です。log4net アセンブリで type が定義されていない場合は、完全名を使用する必要があります。2: ルートノード
ルート ノードの役割は、他のすべてのロガーがデフォルトでそれを継承することです。ルート要素には属性がありません。ルート ノードの子要素には、ロガーと同じ appender-ref、level、および param があります。
3: log4net ノード
Log4net ノードはログ構成全体のルート ノードであり、デバッグ、更新、およびしきい値の属性が含まれています。debug: オプション、値は true または false、デフォルトは false です。log4net の内部デバッグを有効にするには、true に設定します。update: オプション、値は Merge (マージ) または Overwrite (上書き)、デフォルト値は Merge です。[上書き] に設定すると、構成を送信するときに構成されたライブラリがリセットされます。しきい値: オプション。値はリポジトリ (ライブラリ) に登録されているレベルです。デフォルト値は ALL です。
Log4net节点支持的子元素:appender(0或多个)、logger (0或多个)、renderer (0或多个)、root(最多一个)、param(0或多个)。
4: 関連する設定ファイル
デフォルトでは、log4net はアプリケーションの構成ファイル App.config または Web.config に関連付けられており、これらはアセンブリのカスタム プロパティを使用して設定できます。このカスタム属性 log4net.Config.XmlConifguratorAttribute を導入しましょう。
XmlConfiguratorAttribute有3个属性:ConfigFile、ConfigFileExtension、Watch。
ConfigFile:配置文件的名字,文件路径相对于应用程序目录。ConfigFileExtension:配置文件的扩展名,文件路径相对于应用程序的目录,不能和ConfigFile属性一起使用。Watch:如果将Watch属性设置为true,就会监视配置文件,当配置文件发生变化的时候,就会重新加载。例如:
// デフォルトの構成ファイル App.exe.config を監視します
[アセンブリ: log4net.Config.XmlConfigurator(Watch = true)]
//配置文件:App.exe.log4net
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension = "log4net")]
//配置文件:log4net.config
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config")]
也可以在Global.asax的Application_Start里或者是Program.cs中的Main方法中添加,注意这里一定是绝对路径,如下所示:
log4net.Config.XmlConfigurator.Configure(new FileInfo(@"F:/log4net.config"));