log4net在.Net Core使用

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相关调试信息了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值