浅谈Log4net在项目中如何记录日志
一 引入背景
在软件开发周期中,无论是开发中,或是测试中,或是上线后,选择合适的工具监控程序的运行状态至关重要,只有如此,才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享,如何利用Log4net在项目中记录日志文件。在应用程序出现问题时,启用日志记录有助于解决问题。使用log4net,可以在运行时启用日志记录,而无需修改应用程序二进制文件。log4net是帮助程序员输出日志语句到各种输出目标的工具。
log4net支持如下框架:
NET Standard 1.3 via .NET Core 1.0
Microsoft® .NET Framework 1.0
Microsoft .NET Framework 1.1
Microsoft .NET Framework 2.0
Microsoft .NET Framework 3.5
Microsoft .NET Framework 4.0
Microsoft .NET Framework 4.5
Microsoft .NET Framework 3.5 Client Profile
Microsoft .NET Framework 4.0 Client Profile
Microsoft .NET Compact Framework 1.0
Microsoft .NET Compact Framework 2.0
Mono 1.0
Mono 2.0
Mono 3.5
Mono 4.0
Microsoft Shared Source CLI 1.0
CLI 1.0 Compatible
二 log4net概述
(一)日志级别
1.级别归纳
2.级别比较
(1)级别从低=>高排序:ALL<Debug<Info<Warn<Error<Fatal<OFF
(2)日志不能记录低于最低级别的记录,如设置最低级别为Info,则低于Info的级别,都不能记录
code
测试结果
3.利用Filter过滤级别
除此之外,还能利用filter级别过滤,来设置将不同级别记录到相应文件,如将INFO级别信息记录到INFO文件中,将Error级别信息记录到Error文件中。
配置文件
后台代码
static void Main(string[] args)
{
//Log4net几种提错类型
//创建日志记录组件
ILog iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
try
{
iLog.Debug("Debug", new Exception("Debug"));
iLog.Info("Info", new Exception("Info"));
iLog.Warn("Warn", new Exception("Warn"));
iLog.Error("Error", new Exception("Error"));
iLog.Fatal("Fatal", new Exception("Fatal"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
测试结果
(二)级别继承
级别继承很简单,归结为一句话:若本事设置了级别,则用自己的级别,若没设置级别,则继承离自己最近的级别。
例子1
例子2
例子3
例子4
(三)日志输出形式
1.输出文件形式归纳
2.项目中常用的输出形式
3.代码操作
3.1.在Root中定义日志输出媒介
<root>
<level value="ALL" />
<!--定义日志的输出媒介,如下定义四种方式-->
<!--文件形式记录日志-->
<appender-ref ref="LogFileInfoAppender" />
<!--<appender-ref ref="LogFileErrorAppender" />-->
<!--控制台显示日志-->
<appender-ref ref="ConsoleAppender" />
<!--Windows事件日志-->
<appender-ref ref="EventLogAppender" />
<!--数据库日志-->
<appender-ref ref="AdoNetAppender_Oracle" />
</root>
3.2.配置具体的媒介,如下以文件形式为例
<!--定义输出到文件中-->
<appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="E:/Log/log4netInfoLog.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH:mm:ss" />
<!---定义布局模板-->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by Alan_beijing" />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
</layout>
</appender>
3.3.后台代码
class Program
{
static void Main(string[] args)
{
//Log4net几种提错类型
//创建日志记录组件
ILog iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
try
{
iLog.Debug("Debug", new Exception("Debug"));
iLog.Info("Info", new Exception("Info"));
iLog.Warn("Warn", new Exception("Warn"));
iLog.Error("Error", new Exception("Error"));
iLog.Fatal("Fatal", new Exception("Fatal"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
3.4.测试结果
(四)定义日志输出格式
1.常用输出格式归纳
2.code及测试结果
三 代码实例
本示例是基于VS2017控制条程序写的。
1.后台
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using log4net;
using System.Reflection;
[assembly: log4net.Config.XmlConfigurator(Watch = true)]
namespace Log4netDemo
{
class Program
{
static void Main(string[] args)
{
//Log4net几种提错类型
//创建日志记录组件
ILog iLog = log4net.LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
try
{
iLog.Debug("Debug", new Exception("Debug"));
iLog.Info("Info", new Exception("Info"));
iLog.Warn("Warn", new Exception("Warn"));
iLog.Error("Error", new Exception("Error"));
iLog.Fatal("Fatal", new Exception("Fatal"));
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
}
}
}
2.配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<!--声明自定义节点-->
<configSections>
<section name="log4net" type="System.Configuration.IgnoreSectionHandler"/>
</configSections>
<appSettings>
</appSettings>
<log4net>
<root>
<!--<level value="Info" />-->
<level value="ALL" />
<!--定义日志的输出媒介,如下定义四种方式-->
<!--文件形式记录日志-->
<!--<appender-ref ref="LogFile_MinLevel_Info" />-->
<appender-ref ref="LogFileInfoAppender" />
<appender-ref ref="LogFileErrorAppender" />
<!--控制台显示日志-->
<!--<appender-ref ref="ConsoleAppender" />-->
<!--Windows事件日志-->
<!--<appender-ref ref="EventLogAppender" />-->
<!--数据库日志-->
<!--<appender-ref ref="AdoNetAppender_Oracle" />-->
</root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低)-->
<logger name="log4netLevel">
<!--<level value="ALL" />
<level value="DEBUG" />-->
<!--<level value="INFO" />-->
<!--<level value="WARN" />
<level value="ERROR" />-->
<!--<level value="FATAL" />
<level value="OFF" />-->
</logger>
<!--定义输出到文件中-->
<!--<appender name="LogFile_MinLevel_Info" type="log4net.Appender.FileAppender">-->
<appender name="LogFileInfoAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="E:/Log/log4netLogFile_Info.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH:mm:ss" />
<!---定义布局模板-->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by Alan_beijing" />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Info" />
<param name="LevelMax" value="Info" />
</filter>
</appender>
<appender name="LogFileErrorAppender" type="log4net.Appender.FileAppender">
<!--定义文件存放位置-->
<file value="E:/Log/llog4netLogFile_Error.txt" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMdd-HH:mm:ss" />
<!--最大文件大小-->
<maximumFileSize value="10MB" />
<staticLogFileName value="false"/>
<!---定义布局模板-->
<layout type="log4net.Layout.PatternLayout">
<!--每条日志末尾的文字说明-->
<footer value="by Alan_beijing" />
<!--输出格式-->
<!--样例:2008-03-26 13:42:32,111 [10] INFO Log4NetDemo.MainClass [(null)] - info-->
<conversionPattern value="记录时间:%date;文件名:%file;行号:%line;线程ID:[%thread];优先级:%priority;%newline
日志级别:%-5level;运行时间:%r;出错类:%logger property:[%property{NDC}];错误描述:%message" />
</layout>
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="Error" />
<param name="LevelMax" value="Error" />
</filter>
</appender>
<!--定义输出到控制台命令行中-->
<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
</layout>
</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>
<!--定义输出到数据库中,这里举例输出到Access数据库中,数据库为C盘的log4net.mdb-->
<appender name="AdoNetAppender_Access" type="log4net.Appender.AdoNetAppender">
<connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:log4net.mdb" />
<commandText value="INSERT INTO LogDetails ([LogDate],[Thread],[Level],[Logger],[Message]) VALUES (@logDate, @thread, @logLevel, @logger,@message)" />
<!--定义各个参数-->
<parameter>
<parameterName value="@logDate" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%date" />
</layout>
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<parameter>
<parameterName value="@logLevel" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="240" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>
</appender>
</log4net>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
</startup>
</configuration>
四 推荐链接
【01】http://logging.apache.org/log4net/
相关文章:
.NET Core log4net 使用
把旧系统迁移到.Net Core 2.0 日记(2) - 依赖注入/日志NLog
部署用于生产的Exceptionlees(一个强大易用的日志收集服务)
原文地址:https://www.cnblogs.com/wangjiming/p/8600935.html
.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com
浅谈Log4net在项目中如何记录日志相关推荐
- 【搜索引擎】浅谈ElasticSearch在项目中的应用
ElasticSearch(简称ES)是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.它也是目前最受欢迎的企业搜索引擎,其次是Apa ...
- 浅谈数字媒体艺术中的技术应用-3-工具介绍(二)
上一篇文章介绍了数据可视化工具Processing和OpenFrameWorks,以及开源电子硬件Arduino和RaspberryPI.这一篇继续把剩下的几个工具进行逐一的介绍. 商用游戏引擎:Un ...
- 浅谈数字媒体艺术中的技术应用-1-技术概述
这个是我近期在某个大学做的讲座,主要针对的是数字媒体艺术专业的大一-大三的学生,大概听讲座的有100个学生,老师有6-8个.主要讲述了数字媒体艺术专业的同学不熟悉的计算机技术,但是他们到做毕设的时候确 ...
- ai在计算机教学中的应用,浅谈人工智能在教育中的应用
浅谈人工智能在教育中的应用 孙立友 摘要:随着人工智能技术的进步,以及研究的深入和在教育领域的逐步推广,对教育领域产生了深远的影响.人工智能对于弥补当前教育存在的种种缺陷和不足,推动教育发展改革和教学 ...
- 浅谈数字媒体艺术中的技术应用-4-技术路线和学习地图
我们先来看下制作一个互动展示装置的设计思路和技术实现. 当我们大脑里面有一个点子之后,怎么最终输出成一个互动展示装置呢?首先我们需要设计一个外观造型,其次我们需要评估一下这个装置的互动方式,是用VR眼 ...
- 浅谈我在职场中与人相处的技巧
[首页推荐]浅谈我在职场中与人相处的技巧 作者:瘦狐狸 日期:2007-1-3 2:54:00 很多人一谈到人际关系,都说不会处理.我其实也很不会处理复杂的人际关系,年轻的时候,心高气盛的和领 ...
- 计算机应用基础任务化教程笔记,计算机应用基础任务化教程 浅谈计算机应用基础教学中的综合任务...
[摘要]计算机应用基础是中等职业学校的一门重要基础课.此书坚持以"应会"为本质,每章节结束后都会布置综合任务.通过综合任务来培养学生分析问题.解决问题.独立探索.勇于创新的能力.同 ...
- 浅谈一下对cocos2d-x中九宫格精灵的简单理解和使用
浅谈一下对cocos2d-x中九宫格精灵的简单理解和使用 首先,使用cocos new命令创建了一个cocos2d-x的C++项目和Lua项目,在生成的HelloWorld中写测试代码. 1.C++代 ...
- 广积粮,缓称王——浅谈区块链项目的护城河
广积粮,缓称王--浅谈区块链项目的护城河这里写自定义目录标题 最近,一个二次元视频网站项目火遍圈内,上线即暴跌.把各类投资者割的找不着北了.又一个拥有"强大"社区的项目上演见光死, ...
最新文章
- Linux 命令行的聊天工具 CenterIM
- 使用mvn生成webapp失败,尚未找到原因
- 屏幕录像专家6.0_迅捷屏幕录像工具和屏幕录像专家哪个更好用?
- Qt creator5.7 OpenCV249之resize函数(含源码下载)
- 安卓学习笔记38:利用OpenGL ES绘制旋转立方体
- VS2017编写C++多文件时,出现LNK2005、LNK1169报错的解决方法
- Word删除空白页的方法
- Gluster安装+kubesphere3.0
- 2021-09-26 计科 许佳怡
- 美食分享平台有哪些?网友最喜欢的三大美食分享平台盘点
- 说说你平时怎么优化mysql的_面试:给我说说你平时是如何优化MySQL的?
- python 小说下载工具_python 制作网站小说下载器
- 简单小白vr效果制作(unity)
- 一个模拟斗地主的小程序
- 电子元器件:三极管参数笔记(持续记录)
- 笑面的学校日常(14)最近一次更新2017 04 06
- 【Verifying transaction: failed】
- python 挂起_Python Killing挂起函数
- 【已解决】Chrome上js不生效
- 宜信 | 供应链金融+区块链双链合璧