一    引入背景

在软件开发周期中,无论是开发中,或是测试中,或是上线后,选择合适的工具监控程序的运行状态至关重要,只有如此,才能更好地排查程序问题和检测程序性能问题等。本篇文章主要与大家分享,如何利用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/

五  服务区

有喜欢的朋友,可以看一下,不喜欢的的朋友,勿喷,谢谢!!

浅谈Log4net在项目中如何记录日志的更多相关文章

  1. 浅谈redux-form在项目中的运用

    准则 先说一下redux的使用场景,因为如果没有redux,那更不会有redux-form. redux基于Flux架构思想,是一个状态管理框架,其目标是解决单页面应用中复杂的状态管理问题. 日常前端 ...

  2. 【ASP.NET MVC系列】浅谈NuGet在VS中的运用

    一     概述 在我们讲解NuGet前,我们先来看看一个例子. 1.例子: 假设现在开发一套系统,其中前端框架我们选择Bootstrap,由于选择Bootstrap作为前端框架,因此,在项目中,我们 ...

  3. 浅谈线程池(中):独立线程池的作用及IO线程池

    原文地址:http://blog.zhaojie.me/2009/07/thread-pool-2-dedicate-pool-and-io-pool.html 在上一篇文章中,我们简单讨论了线程池的 ...

  4. 浅谈surging服务引擎中的rabbitmq组件和容器化部署

    1.前言 上个星期完成了surging 的0.9.0.1 更新工作,此版本通过nuget下载引擎组件,下载后,无需通过代码build集成,引擎会通过Sidecar模式自动扫描装配异构组件来构建服务引擎 ...

  5. 浅谈如何检查Linux中开放端口列表

    给大家分享一篇关于如何检查Linux中的开放端口列表的详细介绍,首先如果你想检查远程Linux系统上的端口是否打开请点击链接浏览.如果你想检查多个远程Linux系统上的端口是否打开请点击链接浏览.如果 ...

  6. 【Unity游戏开发】浅谈Lua和C#中的闭包

    一.前言 目前在Unity游戏开发中,比较流行的两种语言就是Lua和C#.通常的做法是:C#做些核心的功能和接口供Lua调用,Lua主要做些UI模块和一些业务逻辑.这样既能在保持一定的游戏运行效率的同 ...

  7. 浅谈使用spring security中的BCryptPasswordEncoder方法对密码进行加密与密码匹配

    浅谈使用springsecurity中的BCryptPasswordEncoder方法对密码进行加密(encode)与密码匹配(matches) spring security中的BCryptPass ...

  8. 在 python 项目中如何记录日志

    一. 概述 写本文的目的是我在写 python 项目的时候需要记录日志,我忘记怎么处理了,每次都需要去网上查一遍,好记性不如烂笔头, 这里把查阅的内容记录下来,方便以后查找. python 项目中记录 ...

  9. 源码浅谈(一):java中的 toString()方法

    前言: toString()方法 相信大家都用到过,一般用于以字符串的形式返回对象的相关数据. 最近项目中需要对一个ArrayList<ArrayList<Integer>> ...

随机推荐

  1. mqtt paho ssl java端代码

    参考链接:http://blog.csdn.net/lingshi210/article/details/52439050 mqtt 的ssl配置可以参阅 http://houjixin.blog.1 ...

  2. python常用运算符

    1. / 浮点除法,就算分子分母都是int类型,也返回float类型,比如我们用4/2,返回2.0 2. // 整数除法,根据分子分母的不同组合,返回的值有差异. 正数//正数,取整,比如5//3,返 ...

  3. final类与final方法

    inal---用于类.方法前. final类---不可被继承. final方法---不可被覆盖. final类不能被继承. 如果我们不希望一个类被继承,我们使用final来修饰这个类.这个类将无法被继 ...

  4. Python之函数基础

    1.函数的定义与调用 函数从大方针上考虑总共分为两种:一种是内置函数,另一种是自定义函数.今天主要讲的是自定义函数. s = '金老板小护士' #len(s) def my_len(): #自定义函数 ...

  5. SpringMVC(十三):SpringMVC 与fastjson集成

    1)fastjson jar包下载地址:https://sourceforge.net/projects/fastjson/下载完成后需要把jar包拷贝到WEB-INF/lib文件夹中.2)使用pom ...

  6. POJ-2253 Frogger---最短路变形&&最大边的最小值

    题目链接: https://vjudge.net/problem/POJ-2253 题目大意: 青蛙A想访问青蛙B,必须跳着石头过去,不幸的是,B所在的石头太远了,需要借助其他的石头,求从A到B的路径 ...

  7. 使用Navicat Premium 链接本地数据库的方法(二)

    最早一篇:http://www.cnblogs.com/zhengyeye/p/6363179.html 现在又重新装了电脑系统,需遇到了同样的问题.恰巧记得之前自己写的文档,没准可以帮助自己解决掉这 ...

  8. ORACLE 行转列 案例解析

    -- 创建 国家城市信息 临时表                  WITH T_NATION_CITY_INFO AS(        SELECT '北京'   AS CITY,'中国' AS N ...

  9. 机器学习基石:10 Logistic Regression

    线性分类中的是非题------>概率题, 设置概率阈值后,大于等于该值的为O,小于改值的为X.------>逻辑回归. O为1,X为0: 逻辑回归假设: 逻辑函数/S型函数:光滑,单调, ...

  10. epoll源码分析(转)

    在create后会创建eventpoll对象保存在一个匿名fd的file struct的private指针中,然后进程睡在等待队列上面. 对于等待的fd,通过poll机制在准备好之后会调用相应的cal ...