log4net的使用,可以把日志信息输出到各种不同终端(文本文件、数据库、windows日志等),实现过程主要是各种输出方式的配置文件怎样配置:
1.安装log4net包
如果需要输出到数据库,相应的引入包
注意:如果在.net core中使用,且在Program.cs中注册配置,则必须引入上述第二个包
2.新建配置文件log4net.config
当然配置文件的名字可以自定义,属性为“始终复制”。只需在注册时对得上就好。具体配置方式在官网上就有Apache log4net – Apache log4net: Config Examples - Apache log4net,本文最后也会贴代码描述。
3.调用log4net
(1)普通调用方式,适用在.Net Core和.Net FrameWork中所有项目
//创建logger,名称可以随意定义ILoggerRepository repository = LogManager.CreateRepository("logNETCoreRepository");//指定log4net的配置文件,即你的log4net的文件XmlConfigurator.Configure(repository, new FileInfo("log4net.config"));//声明log对象,指定使用的logger和检索器名称,检索器名称对应日志模板中的logger,可以为程序集名称也可以自定义//var log = log4net.LogManager.GetLogger(repository.Name, "logNETCoreRepository1");//声明log对象,指定使用的logger和检索器名称,检索器名称对应日志模板中的logger,可以为程序集名称也可以自定义,这里为当前方法类全名+方法名var log = log4net.LogManager.GetLogger(repository.Name, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType.FullName+"."+System.Reflection.MethodBase.GetCurrentMethod().Name);//写入日志log.Info("addlog");//写入警告信息log.Warn("Warn");
你也可以将这段整成帮助类来使用。
(2)在.Net Core MVC中可以通过依赖注入的方式使用:
首先在Program.cs的CreateHostBuilder方法中配置Log4net:
public static IHostBuilder CreateHostBuilder(string[] args) =>Host.CreateDefaultBuilder(args).ConfigureLogging(logger => logger.AddLog4Net("log4net.config"))//log4net配置文件.ConfigureAppConfiguration((hostingContext, config) =>{config.Sources.Clear();}).ConfigureWebHostDefaults(webBuilder =>{webBuilder.UseStartup<Startup>();});
然后在控制器或者model中依赖注入ILogger:
public class HomeController : Controller{private readonly ILogger<HomeController> _logger;private readonly MyModel _mm;private readonly IConfiguration _configuration;public HomeController(ILogger<HomeController> logger, MyModel mm, IConfiguration Configuration){_logger = logger;_mm = mm;_configuration = Configuration;_logger.LogInformation("HomeController被构造...");}public IActionResult Index(){_logger.LogInformation("Home Index 被访问...");string ret = _mm.test();string temp = _configuration["ccc"];return Content($"{temp}----{ret}");}}
(3)当然在.Net Framework中可以这么使用,在Properties的AssemblyInfo.cs中添加以下代码,指明log4net的配置文件
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]
这样再需要两个步骤,一个是在log4net.config中将root节点换成logger节点
<logger name="loginfo"><level value="ALL"/><appender-ref ref="rollingAppender" /></logger>
最后在调用时这样调用:
var log=log4net.LogManager.GetLogger("loginfo");//loginfo即为上一步中的logger name
log.Info("addlog")
4.配置信息,包括到追加文本文件,sqlite数据库,mysql数据库和windows日志中。
<?xml version="1.0" encoding="utf-8"?>
<log4net debug="true">//开启调试<!-- Define some output appenders --><appender name="rollingAppender" type="log4net.Appender.RollingFileAppender"><file value="log\log.txt" /><!--追加日志内容--><appendToFile value="true" /><!--防止多线程时不能写Log,官方说线程非安全--><lockingModel type="log4net.Appender.FileAppender+MinimalLock" /><!--可以为:Once|Size|Date|Composite--><!--Composite为Size和Date的组合--><rollingStyle value="Composite" /><!--当备份文件时,为文件名加的后缀--><datePattern value="yyyyMMdd.txt" /><!--日志最大个数,都是最新的--><!--rollingStyle节点为Size时,只能有value个日志--><!--rollingStyle节点为Composite时,每天有value个日志--><maxSizeRollBackups value="3" /><!--可用的单位:KB|MB|GB--><maximumFileSize value="2KB" /><!--置为true,当前最新日志文件名永远为file节中的名字--><staticLogFileName value="true" /><!--输出级别在INFO和ERROR之间的日志--><filter type="log4net.Filter.LevelRangeFilter"><param name="LevelMin" value="INFO" /><param name="LevelMax" value="FATAL" /></filter><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger - %message%newline"/></layout></appender><!--写入到sqlite数据库--><appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"><!--缓冲区事件的大小,设置为小于或者等于1的值,则不会发生任何缓冲,日志记录同步执行,否则事件将被缓冲--><bufferSize value="1" /><!--数据库类型--><connectionType value="System.Data.SQLite.SQLiteConnection,System.Data.SQLite" /><!--数据库地址--><connectionString value="Data Source=~/log.db;Version=3;" /><!--写入日志语句--><commandText value="INSERT INTO Log(Date, Level, Logger, Message) VALUES (@Date, @Level, @Logger, @Message)" /><parameter><!--配置字段--><parameterName value="@Date" /><!--字段数据类型--><dbType value="DateTime" /><!--北京时间--><layout type="log4net.Layout.RawTimeStampLayout" /></parameter><parameter><parameterName value="@Level" /><dbType value="String" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%level" /></layout></parameter><parameter><parameterName value="@Logger" /><dbType value="String" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%logger" /></layout></parameter><parameter><parameterName value="@Message" /><dbType value="String" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%message" /></layout></parameter></appender><!--写入到mysql数据库--><appender name="MysqlAdoNetAppender" type="log4net.Appender.AdoNetAppender"><!--缓冲区事件的大小,设置为小于或者等于1的值,则不会发生任何缓冲,日志记录同步执行,否则事件将被缓冲--><bufferSize value="1" /><!--数据库类型--><connectionType value="MySql.Data.MySqlClient.MySqlConnection,MySql.Data" /><!--数据库地址--><connectionString value="server=192.168.1.188;port=3306;database=enav;uid=root;pwd=root;" /><!--写入日志语句--><commandText value="INSERT INTO lognet(`Date`, `Level`, `Logger`, `Message`) VALUES (@date, @level, @logger, @message)" /><parameter><!--配置字段--><parameterName value="@date" /><!--字段数据类型--><dbType value="DateTime" /><!--北京时间--><layout type="log4net.Layout.RawTimeStampLayout" /></parameter><parameter><parameterName value="@level" /><dbType value="String" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%level" /></layout></parameter><parameter><parameterName value="@logger" /><dbType value="String" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%logger" /></layout></parameter><parameter><parameterName value="@message" /><dbType value="String" /><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%message" /></layout></parameter></appender><!--写入到windows日志中--><appender name="EventLogAppender" type="log4net.Appender.EventLogAppender" ><layout type="log4net.Layout.PatternLayout"><conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" /></layout></appender><!-- levels: OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL --><root><priority value="ALL"/><level value="ALL"/><appender-ref ref="AdoNetAppender" /><appender-ref ref="MysqlAdoNetAppender" /><appender-ref ref="rollingAppender" /><appender-ref ref="EventLogAppender" /></root>
</log4net>
其中在使用MySql时,发现过在使用某些版本Mysql数据库的nuget包时,写入失败,一直报错,换了版本就好了,不知道是不是Mysql一些版本对Log4net的兼容。
还有重要一点,开启log4net调试就在log4net节点中添加debug="true"就好了,就可以在控制台打印log4net相关调试信息了。
完