好记性不如烂笔头,这次是由衷的感受到了!

  log4net 是一个很好用的日志记录工具,引用入项目中,如何查看项目内部运行情况,如何快速定位异常信息,好的日志记录能帮很大的忙;

  log4net 很好用,快速上手,配置简单,可是 (捂脸)自己配置就是配不上啊!!!!因为不想解读源码,只想快速配置好进行读取记录,哎,难死了。。。。。。

  但是功夫不负有心人,只要功夫深,铁棒磨成针!在自己坚持之下,终于配置完成了,能够生成日志,进行查看了! 不说了,开始记录:

  一、单项目单独使用

   1、 准备 log4net.dll(或者在 Vs  中搜索Nuget 程序包,下载 log4net 管理包)添加引用。

    

    

  2、引用完成之后,项目引用中有显示刚才操作dll

    

    3、添加AssemblyInfo 资源信息;(  [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]  )

     

      4、添加log4net.config文件,右键 ---》编辑文件属性:始终复制(一般.config 文件系统会默认始终复制属性,防止特殊情况,检查处理一下。)    

      

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<log4net>
<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志存放位置 ~/..-->
<file value="log\" />
<!--文件命名方式-->
<datePattern value="yyyy-MM-dd&quot;.txt&quot;" />
<!--追加到文本末尾-->
<appendToFile value="true" />
<rollingStyle value="Date" />
<staticLogFileName value="false" />
<maxSizeRollBackups value="20" />
<!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
<param name="MaxSizeRollBackups" value="30" />
<layout type="log4net.Layout.PatternLayout">
<!--%n日志时间:%d [%t] %n日志级别:%-5p %n消息描述:%c [%x] %n%m %n-->
<!--%n异常时间:%d [%t] %n异常级别:%-5p %n异常位置:[%thread] 代码位置(%file:%line) %n消息描述:%message%n异常:%exception%n%n-->
<param name="ConversionPattern" value="%d [%thread] %-5p %message (%file:%line) %n" />
</layout>
</appender>
  <!--识别的log4net配置名称-->
<logger name="loginfo">
<level value="ALL" />
<appender-ref ref="RollingLogFileAppender" />
</logger>
</log4net>
</configuration>

     4、项目使用测试!

      

      

    二、封装log4net 到公用帮助类库中      

      1、在公用帮助类库中,添加 log4net.dll 引用,引用方式同上;

      2、在公用帮助类库中,添加资源引用 AssemblyInfo.cs  添加log4net.config  配置读取信息;方式同上添加方式。

      

      3、封装Log4net  帮助类(LoggerHelper.cs) --看需要自己拓展      

using log4net;
using System;
public class LogerHelper
{
#region
private static ILog _LoggerInfo;
private static ILog LogInfo
{
get
{
if (_LoggerInfo == null)
{
_LoggerInfo = log4net.LogManager.GetLogger("loginfo");
}
return _LoggerInfo;
}
set
{
value = _LoggerInfo;
}
}
#endregion public LogerHelper(Type type)
{
LogInfo = LogManager.GetLogger(type);
} static LogerHelper()
{ } public static void SetConfig()
{
log4net.Config.XmlConfigurator.Configure();
} public static void SetConfig(FileInfo configFile)
{
log4net.Config.XmlConfigurator.Configure(configFile);
} /// <summary>
/// Log4日志Error
/// </summary>
/// <param name="msg"></param>
/// <param name="ex"></param>
public static void Error(Exception ex = null)
{
Error("出现异常!", ex);
} /// <summary>
/// Log4日志
/// </summary>
/// <param name="msg"></param>
/// <param name="ex"></param>
public static void Error(string msg = "出现异常", Exception ex = null)
{
try
{
if (LogInfo.IsErrorEnabled)
{
LogInfo.Error(msg, ex);
}
}
catch { }
} /// <summary>
/// Log4日志Warn
/// </summary>
/// <param name="msg"></param>
public static void Warn(string msg)
{
//Console.WriteLine(msg);
LogInfo.Warn(msg);
} /// <summary>
/// Log4日志Info
/// </summary>
/// <param name="msg"></param>
public static void Info(string msg)
{
//Console.WriteLine(msg);
LogInfo.Info(msg);
} /// <summary>
/// Log4日志Debug
/// </summary>
/// <param name="msg"></param>
public static void Debug(string msg)
{
//Console.WriteLine(msg);
LogInfo.Debug(msg);
}
}

      4、工具类封装loghelper 后,在输出/展示应用程序中,需要添加 log4net.config  文件,如果不添加,将不会记录日志:

       比如我要在 console 控制台应用程序中使用日志,使用log4net 记录输出日志时,需要在console 应用程序中添加 log4net.config 文件。

      

      

      5、日志样例:

      

    三、总结

    1、引用log4net.dll 后,看在哪使用,如果单独使用,在当前应用程序的资源文件AssemblyInfo.cs 中添加 ;

      (如果你有公用的工具类库,放置封装log4net 的Helper信息时,在log4netHelper  所在应用程序资源文件AssemblyInfo.cs 中添加 ),

      [assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

    2、在最终的输出应用程序中添加 log4net.config,设置文件属性为始终复制;

    3、log4net.config  中内容记录展示样式:(log4net.Layout.PatternLayout --》ConversionPattern 配置)

%m[%message] : 输出的日志消息
%n : 换行
%d[%datetime] : 输出当前语句运行的时刻
%r : 输出程序从运行到执行到当前语句时消耗的毫秒数
%d : 当前语句所在的线程ID
%p : 日志的当前优先级别
%c :当前日志对象的名称
%L : 输出语句所在的行号
%F :输出语句所在的文件名
%-数字 :表示该项的最小长度,如果不够,则用空格填充

   本文log4net.config  文件满足一般需要,想配置更多,功能更全,建议了解一下log4net.Config 节点参数。

   配置到类库中进行调用参考:http://grim1980.blog.sohu.com/255519333.html

   配置文件log4net.config  配置内容解说:https://www.cnblogs.com/kissazi2/p/3392605.html

   如有不合理之处,请大家多多指教。

   如果您觉得本文对您有帮助,欢迎点击“收藏”按钮!(/:微笑)欢迎转载,转载请注明出处。

Log4Net 使用及组合公共类的更多相关文章

  1. 一个Java文件至多包含一个公共类

    编写一个java源文件时,该源文件又称为编译单元.一个java文件可以包含多个类,但至多包含一个公共类,作为编译时该java文件的公用接口,公共类的名字和源文件的名字要相同,源文件名字的格式为[公共类 ...

  2. IOS 公共类-MyDateUtil 日期处理Util

    IOS 公共类-MyDateUtil 日期处理Util 此为处理日期的公共类.适用IOS6+ .h文件: #import <Foundation/Foundation.h> //适用 IO ...

  3. IOS 公共类-MyMBProgressUtil Progress显示

    IOS 公共类-MyMBProgressUtil Progress显示 此公共类用于显示提示框,对MBProgress的进一步封装.可以看下面的代码 接口: @interface MyMBProgre ...

  4. 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成员)

    [源码下载] 不可或缺 Windows Native (21) - C++: 继承, 组合, 派生类的构造函数和析构函数, 基类与派生类的转换, 子对象的实例化, 基类成员的隐藏(派生类成员覆盖基类成 ...

  5. ASP.NET中常用的几个李天平开源公共类LTP.Common,Maticsoft.DBUtility,LtpPageControl

    ASP.NET中常用的几个开源公共类: LTP.Common.dll: 通用函数类库     源码下载Maticsoft.DBUtility.dll 数据访问类库组件     源码下载LtpPageC ...

  6. Java ClassLoader基础及加载不同依赖 Jar 中的公共类

    转载自:最新内容及最清晰格式请见 http://www.trinea.cn/android/java-loader-common-class/ 本文主要介绍 ClassLoader 的基础知识,Cla ...

  7. ASP.NET中常用的几个李天平开源公共类LTP.Common,Maticsoft.DBUtility,LtpPageControl (转)

    ASP.NET中常用的几个开源公共类: LTP.Common.dll: 通用函数类库     源码下载Maticsoft.DBUtility.dll 数据访问类库组件     源码下载LtpPageC ...

  8. 自己封装的C#操作redis公共类

    关于C#操作redis公共类,网上有很多版本,每个版本我都看了,发觉还是不够完美,都存在一个问题,只能操作单一的缓存数据库 redis指令支持上,这里可以自己去扩展,下面分享下我近期封装的一个redi ...

  9. Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类

    Android公共库——图片缓存 网络缓存 下拉及底部更多ListView 公共类 转载自http://www.trinea.cn/android/android-common-lib/ 介绍总结的一 ...

随机推荐

  1. 每天一点点之vue框架开发 - @click-native-prevent

    1.在封装好的组件上使用,所以要加上.native才能click 2.prevent就相当于..event.preventDefault() 所以@click.native.prevent是用来阻止默 ...

  2. 官网英文版学习——RabbitMQ学习笔记(九)总结

    RabbitMQ与spingboot相整合,主要步骤也很简单: 一.首先需要的是添加依赖 二.需要设置属性,属性主要是设置rabbitmq的地址端口,用户名密码回调等需要用到的一些常量,在整合过程中, ...

  3. mybatis update set 多个字段

    <update id="updateCustomer" parameterType="com.entrym.domain.Customer"> UP ...

  4. 一百一十二、SAP的OO-ALV之六,复制一个工程的工具栏到另外一个工程的工具栏

    一.我们输入SE38,查看一个SAP的标准查询 二.可以看到这个程序拥有一个标准的工具栏 三.我们来到, 输入这个程序名,再点状态 四.把工具栏复制过来 五.弹出的窗口点对勾 六.系统提示已经复制 七 ...

  5. 干货分享|Critique Essay写作解析

    Critique essay要求学生对另一篇文章进行批判性分析,通常是一本书.期刊文章或论文.不管你的专业是什么,你可能会被要求在某个时候写一篇Critique essay.拿心理学专业举例,评论一篇 ...

  6. 细说 OLAP 与 OLTP

    OLAP (Online analytical processing)[联机分析处理] 起源 数据库概念最初源于1962年Kenneth Iverson发表的名为"A Programming ...

  7. opencv运动物体识别

    import cv2 import time import datetime import os def mkdir(path): folder = os.path.exists(path) if n ...

  8. 三、ReactJS、jsx、 Component 特性

    reactjs特性: 基于组件(Component)化思考 用 JSX 进行声明式(Declarative)UI 设计 使用 Virtual DOM Component PropType 错误校对机制 ...

  9. 2.10 Jetpack LiveData部分

    LiveData是一个可观察的数据持有者类,但和其他的可观察对象不同,它与生命周期相关联,比如Activity的生命周期.LiveData能确保仅在Activity处于活动状态下才会更新.也就是说当观 ...

  10. MySQL新增数据,存在就更新,不存在就添加

    1.插入一条数据,存在就更新,不存在就更新(必须现有唯一键)使用insert ignore语句: insert ignore into table(col1,col2) values ('a','b' ...