- 安装log4net包
- 在项目创建Configs文件夹,创建log4netsettings.json文件(自定义)
-
{ "Log4Net": { "Dir": "G:/Log/JWProject.WorkerService/LogFile/Log4Net/api/", //日誌文件存放路徑 "Cfg": "/Configs/log4net.xml" //配置文件路径 } }
-
再到Configs文件夹创建log4net.xml文件
-
<?xml version="1.0" encoding="utf-8" ?> <!-- 創建時間:2014/08/15 創建人:glz 文件名:log4net.xml 文件路徑:/log4net/log4net.xml 文件說明:本文件是log4net的配置文件,用於生成記錄 系統 FATAL | ERROR | WARN | INFO | DEBUG 等信息的文件 日誌記錄: (1)日誌記錄分兩種日誌文件: 一種(Error日誌): FATAL | ERROR | WARN 為一類; 另一種(INFO日誌):INFO > DEBUG 為一類。 (2)日誌文件存放位置,格式,大小: 存放位置:統一存放在根目錄的log4net文件夾下的LogFile文件夾下(log4net/LogFile/) Error日誌:存放于LogError文件夾; INFO日誌:存放于LogInfo文件夾。 日誌格式:日期/日期.log.0...;例如:2014-08-15/2014-08-15.log.0 每個日誌文件的大小:50KB 文件編碼:UTF-8 (3)日誌文件記錄信息格式:(一般格式) Error日誌: 例如:Recording Time:2014-08-15 15:48:21,502 Thread ID:[18] Log level:ERROR Error Class:logError property:[(null)] Error Description: error test info - LogHelper.GetLogError.Error hostName|userName: IIS APPPOOL\newvipg20140725 Location: ASP.global_asax.Application_BeginRequest(d:\POSCODE\glz\Global.asax:266) UserIP - 58.177.234.52 Error Path - http://localhost:6060/admin/MaDelData.aspx INFO日誌: 例如: Recording Time:2014-08-14 17:58:08,276 Thread ID:[19] Log level:INFO Description: route i am coming UserName - glz UserIP - 58.177.234.52 Error Path - http://localhost:6060/admin/MaDelData.aspx 參考文件:ZData/log4Net技术大全.doc --> <configuration> <configSections> <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/> </configSections> <log4net> <!--1、所有Logger的父节点,root的设置在所有的logger中都起作用--> <!--2、如果root和logger中设置了相同的appender,日志会被记录两次--> <root> <level value="All"/> <appender-ref ref="ErrorAppender"/> <appender-ref ref="WarnAppender"/> <appender-ref ref="InfoAppender"/> <!--<appender-ref ref="RedisAppender" />--> </root> <!--<logger name ="logError"> <level value="ERROR"/> <appender-ref ref="ErrorAppender"/> </logger> <logger name ="logInfo"> <level value="INFO"/> <appender-ref ref="InfoAppender"/> </logger>--> <!--1.一個appender 可以被多個logger共用--> <!--2.logger可以同時引用多個appender--> <!--Logger是通过类似命名空间的层次结构命名和管理的,每一个应用中的 Logger都有一个Root Logger,也就是默认Logger,<root>项就是用于定义 Root Logger的。但是,<root>项并不是必须的,因为<root>项只有在配置 文件中没有配置任何Logger的时候才起作用,此时,log4net将使用<root> 项的配置作为创建一个Logger时的默认配置。所以,在这个例子里,因为上面已经配置了 <logger>,所以<root>并不起作用,放在这里只是为了做一个完整的配置说明。 但是,需要注意的是,<root>并非完全不起作用。如果我们在代码中使用了 LogManager.GetLog(...),其中的参数指定了一个不在配置文件中的Logger的 @name时,那么log4net将会把<root>作为默认Logger,并依据<root>的配置创建一个Logger。 --> <!--..................................ERROR........................................--> <!--FATAL > ERROR --> <appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="/LogError/"/> <param name="AppendToFile" value="true"/> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <param name="lockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <!--输出日志文件的编码格式--> <param name="Encoding" value="utf-8" /> <!--切割最多文件数 -1表示不限制产生日志文件数--> <param name="MaxSizeRollBackups" value="-1"/> <!-- 每个文件的大小限制 --> <param name="MaximumFileSize" value="50MB"/> <!--是否只寫到一個文件中--> <param name="StaticLogFileName" value="false"/> <!-- RollingStyle Composite 综合 Size 按大小 Date 按时间 --> <param name="RollingStyle" value="Composite"/> <!--文件名--> <param name="DatePattern" value="yyyy-MM-dd/"Erp."yyyy-MM-dd".Elog""/> <!--计数类型为1,2,3…--> <param name="CountDirection" value="1"/> <layout type="GLProject.CtmLog.Layout.CtmPatternLayout"> <param name="Header" value="
 ---------------------application startup--------------------- 
" /> <conversionPattern value="%newlineTimestamp: %date %newlineThread: [%thread] %newlineLevel: %level %newlineLoggerName: %logger%newlineHost: %username %newlinePath: %file:%line %newlineClass.Method: %class.%method %newlineDescription: %message %newline"/> <param name="Footer" value="
 ---------------------application shutdown--------------------- 
" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="ERROR"></param> <param name="LevelMax" value="OFF"></param> </filter> </appender> <!--..................................WARN........................................--> <!--WARN 日誌 存放SQL語句--> <appender name="WarnAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="/LogWarn/"/> <param name="AppendToFile" value="true"/> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <!--输出日志文件的编码格式--> <param name="Encoding" value="utf-8" /> <!--切割最多文件数 -1表示不限制产生日志文件数--> <param name="MaxSizeRollBackups" value="-1"/> <!-- 每个文件的大小限制 --> <param name="MaximumFileSize" value="50MB"/> <!--是否只寫到一個文件中--> <param name="StaticLogFileName" value="false"/> <!-- RollingStyle Composite 综合 Size 按大小 Date 按时间 --> <param name="RollingStyle" value="Composite"/> <!--文件名--> <param name="DatePattern" value="yyyy-MM-dd/"Erp."yyyy-MM-dd".Wlog""/> <!--计数类型为1,2,3…--> <param name="CountDirection" value="1"/> <layout type="GLProject.CtmLog.Layout.CtmPatternLayout"> <param name="Header" value="
 ---------------------application startup--------------------- 
" /> <conversionPattern value="%newlineTimestamp: %date %newlineThread: [%thread] %newlineLevel: %level %newlineLoggerName: %logger%newlineHost: %username %newlinePath: %file:%line %newlineClass.Method: %class.%method %newlineDescription: %message %newline"/> <param name="Footer" value="
 ---------------------application shutdown--------------------- 
" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="WARN"></param> <param name="LevelMax" value="WARN"></param> </filter> </appender> <!--....................................INFO......................................--> <!--INFO--> <appender name="InfoAppender" type="log4net.Appender.RollingFileAppender"> <param name="File" value="/LogInfo/"/> <!--是否追加到文件--> <param name="AppendToFile" value="true"/> <!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全--> <param name="LockingModel" type="log4net.Appender.FileAppender+MinimalLock" /> <!--输出日志文件的编码格式--> <param name="Encoding" value="utf-8" /> <!--切割最多文件数 -1表示不限制产生日志文件数--> <param name="MaxSizeRollBackups" value="-1"/> <!-- 每个文件的大小限制 --> <param name="MaximumFileSize" value="50MB"/> <!--是否只寫到一個文件中--> <param name="StaticLogFileName" value="false"/> <!-- -按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite]) 【RollingStyle: Composite 综合 Size 按大小 Date 按时间】 --> <param name="RollingStyle" value="Composite"/> <!--文件名--> <param name="DatePattern" value="yyyy-MM-dd/"Erp."yyyy-MM-dd".Ilog""/> <!--计数类型为1,2,3…--> <param name="CountDirection" value="1"/> <layout type="GLProject.CtmLog.Layout.CtmPatternLayout"> <param name="Header" value="
 ---------------------application startup--------------------- 
" /> <conversionPattern value="%newlineTimestamp: %date %newlineThread: [%thread] %newlineLevel: %level %newlineLoggerName: %logger%newlineHost: %username %newlinePath: %file:%line %newlineClass.Method: %class.%method %newlineDescription: %message %newline"/> <param name="Footer" value="
 ---------------------application shutdown--------------------- 
" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO"></param> <param name="LevelMax" value="INFO"></param> </filter> </appender> <!--日志的等级,它们由高到底分别为: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL 高于等级设定值方法(如何设置参见"配置文件详解")都能写入日志, Off所有的写入方法都不写到日志里,ALL则相反。例如当我们设成Info时, logger.Debug就会被忽略而不写入文件, 但是FATAL, ERROR,WARN,INFO会被写入,因为他们等级高于INFO --> <!--redis單服務器版--> <!--<appender name="RedisAppender" type="GLProject.RedisLog4NetCore.Appender.RedisAppender, GLProject.RedisLog4NetCore"> <remoteAddress value="192.168.88.91" /> <remotePort value="6379" /> <remotePassword value="123456" /> <remoteDbId value="8" /> <listName value="jcerp-log" /> <layout type="GLProject.RedisLog4NetCore.Layout.LogMessageLayout,GLProject.RedisLog4NetCore"> <param name="IncludeLocationInformation" value="true" /> <param name="AdditionalFields" value="type:JCErp,Environment:online,Level:%level,thread:%thread" /> </layout> <filter type="log4net.Filter.LevelRangeFilter"> <param name="LevelMin" value="INFO"></param> <param name="LevelMax" value="OFF"></param> </filter> </appender>--> <!--redis集群服務器版--> <!--<appender name="RedisAppender" type="VIPStation.RedisLog4NetCore.Appender.RedisClusterAppender, VIPStation.RedisLog4NetCore"> <redisServer value="192.168.88.91:6380,password=123456,192.168.88.91:6381,password=123456,192.168.88.91:6382,password=123456,192.168.88.91:6383,password=123456,192.168.88.91:6384,password=123456,192.168.88.91:6385,password=123456" /> <listName value="newwebvip-log" /> <layout type="VIPStation.RedisLog4NetCore.Layout.LogMessageLayout,VIPStation.RedisLog4NetCore"> <param name="IncludeLocationInformation" value="true" /> <param name="AdditionalFields" value="type:NewWebVip,Environment:online,Level:%level,thread:%thread" /> </layout> </appender>--> </log4net> </configuration>
还要在项目的F:\项目路径\bin\Debug\net8.0\Configs位置复制刚刚创建了两个配置文件, 否则会提示找不到文件
-
-
接下来就是全局注册了,位置启动项Program.cs
-
var configuration = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json") .Build(); var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); IHost host = Host.CreateDefaultBuilder(args) .UseWindowsService(options => { options.ServiceName = "JWProject Worker Service"; }) .ConfigureServices((context,services) => { services.AddCtmLog4Net(configuration);//注册的log4 }) .Build(); await host.RunAsync()
在业务层依赖注入使用