.net 中用的比較多的日志是log4net 和 NLog,這次兩個都嘗試一次
log4net 我直接在webapi中添加,NLog 單獨創建了一個項目,方便業務邏輯層或其他地方調用
log4net的添加和調用
首先在webapi安裝 log4net ,然后新增 log4net.config 以及 LogHelper.cs 兩個文件
log4net.config 源碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<log4net>
<!-- 信息日志類 -->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="AdoNetAppender" />
<appender-ref ref="InfoAppender" />
</logger>
<!-- 警告日志類 -->
<logger name="logwarn">
<level value="ALL" />
<appender-ref ref="WarnAppender" />
</logger>
<!-- 錯誤日志類-->
<logger name="logerror">
<level value="ALL" />
<appender-ref ref="AdoNetAppender" />
<appender-ref ref="ErrorAppender" />
</logger>
<!-- 異常日志類-->
<logger name="logfatal">
<level value="ALL" />
<appender-ref ref="AdoNetAppender" />
<appender-ref ref="FatalAppender" />
</logger>
<!-- 文件保存日志 -->
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路徑: 兼容相對路徑和絕對路徑 -->
<param name= "File" value= "Log\info\"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--保留天數-->
<param name= "MaxSizeRollBackups" value= "10"/>
<!--日志文件名是否固定不變的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式為:20170112.log-->
<param name= "DatePattern" value= "yyyyMMdd".log""/>
<!--日志根據日期滾動-->
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
</layout>
</appender>
<appender name="WarnAppender" type="log4net.Appender.RollingFileAppender">
<param name= "File" value= "Log\warn\"/>
<param name= "AppendToFile" value= "true"/>
<param name= "MaxSizeRollBackups" value= "10"/>
<param name= "StaticLogFileName" value= "false"/>
<param name= "DatePattern" value= "yyyyMMdd".log""/>
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
</layout>
</appender>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<param name= "File" value= "Log\error\"/>
<param name= "AppendToFile" value= "true"/>
<param name= "MaxSizeRollBackups" value= "10"/>
<param name= "StaticLogFileName" value= "false"/>
<param name= "DatePattern" value= "yyyyMMdd".log""/>
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
</layout>
</appender>
<appender name="FatalAppender" type="log4net.Appender.RollingFileAppender">
<param name= "File" value= "Log\fatal\"/>
<param name= "AppendToFile" value= "true"/>
<param name= "MaxSizeRollBackups" value= "10"/>
<param name= "StaticLogFileName" value= "false"/>
<param name= "DatePattern" value= "yyyyMMdd".log""/>
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%date{yyyy-MM-dd HH:mm:ss.fff} %-5p %m%n" />
</layout>
</appender>
<!-- 控制台輸出日志 -->
<appender name="ColoredConsoleAppender" type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="ERROR" />
<foreColor value="Red, HighIntensity" />
</mapping>
<mapping>
<level value="Info" />
<foreColor value="Green" />
</mapping>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%n%date{HH:mm:ss.fff} %-5level %m" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Fatal" />
</filter>
</appender>
<!-- 數據庫保存 -->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<bufferSize value="1" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="data source=.;initial catalog=test_log;integrated security=true" />
<commandText value="INSERT INTO log([userid],[level],[ip],[msg],[exception]) VALUES (@userid,@level,@ip, @msg,@exception)" />
<parameter>
<parameterName value="@userid"/>
<dbType value="Int64"/>
<size value="64"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{userid}"/>
</layout>
</parameter>
<parameter>
<parameterName value="@level" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@ip" />
<dbType value="String" />
<size value="50" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%X{ip}" />
</layout>
</parameter>
<parameter>
<parameterName value="@msg" />
<dbType value="String" />
<size value="4000" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="2000" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
</log4net>
</configuration>
LogHelper.cs源碼如下:
public class LogHelper
{
private const string repositoryName = "NETCoreRepository";
private const string configFile = "log4net.config";
private static ILoggerRepository repository { get; set; }
private static readonly ILog _loginfo =LogManager.GetLogger(repositoryName, "loginfo");
private static readonly ILog _logerror = LogManager.GetLogger(repositoryName, "logerror");
private static readonly ILog _logwarn = LogManager.GetLogger(repositoryName, "logwarn");
private static readonly ILog _logfatal = LogManager.GetLogger(repositoryName, "logfatal");
public static void Configure()
{
repository = LogManager.CreateRepository(repositoryName);
XmlConfigurator.Configure(repository, new FileInfo(configFile));
}
public static void Info(string msg)
{
_loginfo.Info(msg);
}
public static void Warn(string msg)
{
_logwarn.Warn(msg);
}
public static void Error(string msg)
{
_logerror.Error(msg);
}
public static void Fatal(string msg)
{
_logfatal.Fatal(msg);
}
最后在Startup.cs文件的ConfigService方法中添加以下代碼,讀取配置
LogHelper.Configure(); //使用前先配置
log4net 就配置好了,需要調用可以執行
LogHelper.Info("XXX");
在webapi根目錄下就會生成Log文件夾,里面分別記錄 info warn error fatal 日志文件
NLog的新增和調用
首先安裝NLog.web.AspNetCore
NLog 也需要兩個文件 nlog.config 以及 NLogHelper.cs
新增項目Summer.Logger,項目下新增NLogHelper.cs (如果不想單獨新建logger項目,也可以直接把這兩個文件放在要引用的項目下)
NLogHelper.cs 源碼如下,只有一行代碼:
public class NLogHelper : NLog.Logger
{
public static readonly NLog.Logger logger = NLog.Web.NLogBuilder.ConfigureNLog("nlog.config").GetCurrentClassLogger();
}
nlog.config 文件放在要引用的項目根目錄下,且屬性設置為 “始終復制”
假設在Service項目要引用NLog,先引用Logger項目,並添加nlog.config
nlog.config源碼如下:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
autoReload="true">
<!-- the targets to write to -->
<targets>
<!-- 輸出到文件,這個文件記錄所有的日志 -->
<!--<target xsi:type="File" name="allfile" fileName="NLog\LogAll\${shortdate}.htm"
layout="<HR COLOR=red>${longdate}<BR>${logger}<BR>${uppercase:${level}}<BR>${message} ${exception}<HR Size=1>" />-->
<!-- 輸出到文件,這個文件記錄錯誤日志 -->
<target xsi:type="File" name="logError" fileName="NLog\LogError\${shortdate}.htm"
layout="<HR COLOR=red>【異常時間】:${date} <BR>【異常級別】:${level:uppercase=true} <BR>${message}<HR Size=1>" />
<!-- 輸出到文件,這個文件記錄操作日志 -->
<target xsi:type="File" name="logInfo" fileName="NLog\LogInfo\${shortdate}.htm"
layout="<HR COLOR=red>【操作時間】:${date} <BR>【操作級別】:${level:uppercase=true} <BR>${message}<HR Size=1>" />
</targets>
<!-- rules to map from logger name to target -->
<rules>
<!--All logs, including from Microsoft-->
<!--<logger name="*" minlevel="Trace" writeTo="allfile" />-->
<logger name="*" minlevel="Error" writeTo="logError" />
<logger name="*" minlevel="Info" maxLevel="Info" writeTo="logInfo" />
<logger name="Microsoft.*" maxLevel="Info" final="true" />
</rules>
</nlog>
引用的代碼如下:
NLogHelper.logger.Error("XXX");
在項目運行目錄就會生成NLog文件夾,里面記錄相關日志
以上就是log4net 和NLog 接入.net core 3.1 的方法