1、在项目根目录新建文件log4net.config,此文件中的节点解释还请自动百度。

文件实例:

<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
</configSections>
<!--日志-->
<log4net>
<logger name="logerror">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</logger>
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
<logger name="logdata">
<level value="All" />
<appender-ref ref="DataBaseAppender" />
</logger>

<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\Error\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMddHH&quot;.log&quot;" />
<staticLogFileName value="false" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<file value="logs\Info\" />
<appendToFile value="true" />
<rollingStyle value="Date" />
<datePattern value="yyyyMMddHH&quot;.log&quot;" />
<staticLogFileName value="false" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>

<!--定义输出到数据库-->
<appender name="DataBaseAppender" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数-->
<bufferSize value="0" />
<!--日志数据库连接串-->
<connectionType value="MySql.Data.MySqlClient.MySqlConnection, MySql.Data, Version=6.9.12.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d" />
<connectionString value="Server=192.168.250.38;Port=3307;Database=datashar; User=root;Password=pass@word1;Charset=utf8mb4;SslMode=None" />
<!--<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.30319.33440, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="Server=.;Database=Test; User=sa;Password=123;" />-->
<!--日志数据库脚本-->
<commandText value="INSERT INTO datashare_operatelog (ID,TableName,ColumnName,OldValue,NewValue,OperateType,OperateTime,OperateUserID,OperateUserName) VALUES (@ID,@TableName,@ColumnName,@OldValue,@NewValue,@OperateType,@OperateTime,@OperateUserID,@OperateUserName)" />
<!--主键ID-->
<parameter>
<parameterName value="@ID" />
<dbType value="String" />
<size value="36" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{ID}" />
</layout>
</parameter>
<!--表名TableName -->
<parameter>
<parameterName value="@TableName" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{TableName}" />
</layout>
</parameter>
<!--列名ColumnName -->
<parameter>
<parameterName value="@ColumnName" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{ColumnName}" />
</layout>
</parameter>
<!--旧值 OldValue -->
<parameter>
<parameterName value="@OldValue" />
<dbType value="String" />
<size value="2000" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OldValue}" />
</layout>
</parameter>
<!--新值 NewValue -->
<parameter>
<parameterName value="@NewValue" />
<dbType value="String" />
<size value="2000" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{NewValue}" />
</layout>
</parameter>
<!--操作类型OperateType -->
<parameter>
<parameterName value="@OperateType" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateType}" />
</layout>
</parameter>
<!--操作时间OperateTime -->
<parameter>
<parameterName value="@OperateTime" />
<dbType value="DateTime" />
<size value="6" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateTime}" />
</layout>
</parameter>
<!--操作人ID OperateUserID -->
<parameter>
<parameterName value="@OperateUserID" />
<dbType value="String" />
<size value="36" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateUserID}" />
</layout>
</parameter>
<!--操作人姓名OperateUserName -->
<parameter>
<parameterName value="@OperateUserName" />
<dbType value="String" />
<size value="255" />
<layout type="OD_FrameWork.Common.Helper.MyLayout">
<conversionPattern value="%property{OperateUserName}" />
</layout>
</parameter>
</appender>

<!-- Setup the root category, add the appenders and set the default level -->
<root>
<!--发布时建议修改成 ERROR-->
<level value="ALL" />
<appender-ref ref="DataBaseAppender" />
</root>
</log4net>
</configuration>

2、找到项目的配置文件(App.config或者Web.config)添加以下代码:

<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</sectionGroup>
</configSections>
<log4net configSource="log4net.config" />

3、引用log4net.dll,如果没有可以通过nuget添加。

4、找到项目中的AssemblyInfo.cs文件  添加以下代码

//[assembly: log4net.Config.XmlConfigurator(Watch = true)]
//注意: ConfigFile 可以指定相对路径 和 绝对路径。 eg: /log/xxxx.log 或者 d://log//xxxx.log
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", ConfigFileExtension = "config", Watch = true)]

5、如果是CS程序,在根目录的Program.cs中的Main方法中添加:

如果是BS程序,在根目录的Global.asax.cs(没有新建一个)中的Application_Start方法中添加:

添加以下代码

log4net.Config.XmlConfigurator.Configure();
var logCfg = new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config");
XmlConfigurator.ConfigureAndWatch(logCfg);
LogHelper.SetConfig(new FileInfo(AppDomain.CurrentDomain.BaseDirectory + "log4net.config"));

6、新建一个文件LogHelper.cs,里面的代码如下:

public class LogHelper
{
//log4net日志专用
public static readonly log4net.ILog loginfo = log4net.LogManager.GetLogger("loginfo");
public static readonly log4net.ILog logerror = log4net.LogManager.GetLogger("logerror");
public static readonly log4net.ILog logedata = log4net.LogManager.GetLogger("logdata");

public static void SetConfig()
{
log4net.Config.XmlConfigurator.Configure();
}

/// <summary>
/// 设置log4net配置文件路径
/// </summary>
/// <param name="configFile">log4net配置文件路径</param>
public static void SetConfig(FileInfo configFile)
{
log4net.Config.XmlConfigurator.Configure(configFile);
}
/// <summary>
/// 普通的文件记录日志
/// </summary>
/// <param name="info"></param>
public static void WriteLog(string info)
{
loginfo.Info("\r\n" + info + "\r\n");
}
/// <summary>
/// 错误日志
/// </summary>
/// <param name="info"></param>
/// <param name="se"></param>
public static void WriteLog(string info, Exception ex)
{
logerror.Error("\r\n" + info + "\r\n", ex);
}

/// <summary>
/// 数据库日志
/// </summary>
/// <param name="Id">GUID</param>
/// <param name="tableName">表名称</param>
/// <param name="columnName">列名(可为空)</param>
/// <param name="oldValue">旧记录的Json字符串</param>
/// <param name="newValue">新纪录的 Json字符串</param>
/// <param name="operateType">操作类型(Update,Insert,Delete)</param>
/// <param name="operateTime">操作时间</param>
/// <param name="operateUserID">操作人ID</param>
/// <param name="operateUserName">操作人姓名</param>
public static void WriteLog(string Id, string tableName, string columnName, string oldValue, string newValue, string operateType, DateTime? operateTime, string operateUserID, string operateUserName)
{
bool d = logedata.IsInfoEnabled;
logedata.Info(new LogContent(Id, tableName, columnName, oldValue, newValue, operateType, operateTime, operateUserID, operateUserName));
}
}

7、新建文件LogContent.cs(这个文件主要为了写日志到数据库的),代码如下:

public class LogContent : IRequiresSessionState
{
public LogContent()
{

}

public LogContent(string Id, string tableName, string columnName, string oldValue, string newValue, string operateType, DateTime? operateTime, string operateUserID, string operateUserName)
{
ID = Id;
TableName = tableName;
ColumnName = columnName;
OldValue = oldValue;
NewValue = newValue;
OperateType = operateType;
OperateTime = operateTime;
OperateUserID = operateUserID;
OperateUserName = operateUserName;
}

/// <summary>
/// 主键ID
/// </summary>
public System.String ID { get; set; }

/// <summary>
/// 表名称
/// </summary>
public System.String TableName { get; set; }

/// <summary>
/// 列名
/// </summary>
public System.String ColumnName { get; set; }

/// <summary>
/// 旧值
/// </summary>
public System.String OldValue { get; set; }

/// <summary>
/// 新值
/// </summary>
public System.String NewValue { get; set; }

/// <summary>
/// 操作类型
/// </summary>
public System.String OperateType { get; set; }

/// <summary>
/// 操作时间
/// </summary>
public System.DateTime? OperateTime { get; set; }

/// <summary>
/// 操作人ID
/// </summary>
public System.String OperateUserID { get; set; }

/// <summary>
/// 操作人姓名
/// </summary>
public System.String OperateUserName { get; set; }
}

public class MyLayout : PatternLayout
{
public MyLayout()
{
this.AddConverter("property", typeof(LogInfoPatternConverter));
}
}

public class LogInfoPatternConverter : PatternLayoutConverter
{

protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (Option != null)
{
// Write the value for the specified key
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
}
else
{
// Write all the key value pairs
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
}
}
/// <summary>
/// 通过反射获取传入的日志对象的某个属性的值
/// </summary>
/// <param name="property"></param>
/// <returns></returns>

private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
{
object propertyValue = string.Empty;
PropertyInfo propertyInfo = loggingEvent.MessageObject.GetType().GetProperty(property);
if (propertyInfo != null)
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null);
return propertyValue;
}
}

8、上面7步完成之后就可以轻松愉快的调用写日志的方法了!

info:LogHelper.WriteLog("ListenStatus,DateTime:" + dateTime.ToString("yyyyMMddHHmmss"));

Error:LogHelper.WriteLog("ListenStatus,DateTime:" + dateTime.ToString("yyyyMMddHHmmss"),ex);

注意:log4net.config的属性设置:

.net 项目如何添加log4net日志记录的更多相关文章

  1. .NET Worker Service 添加 Serilog 日志记录

    前面我们了解了 .NET Worker Service 的入门知识[1] 和 如何优雅退出 Worker Service [2],今天我们接着介绍一下如何为 Worker Service 添加 Ser ...

  2. python添加fluent日志记录

    istio默认会进行日志的记录,但是仅仅记录到服务.以及服务之间调用的信息,不记录业务日志. 如: 所以需要添加业务日志记录. 1.python引入package fluentmsgpack 2.代码 ...

  3. springboot添加fluent日志记录

    istio默认会进行日志的记录,但是仅仅记录到服务.以及服务之间调用的信息,不记录业务日志. 如: 所以需要添加业务日志记录. 1.引入依赖 <dependency>     <gr ...

  4. log4net日志记录

    这里是接着上一篇来优化的,上篇:ASP.NET MVC中错误日志信息记录 log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件,数据库,EventLog等),日志就是程序的黑 ...

  5. Log4Net日志记录两种方式

     简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.     log4net是Ap ...

  6. C#Log4net日志记录组件的使用

    一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO ...

  7. ASP.NET MVC4中加入Log4Net日志记录功能

    前言 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging等,虽然多多少少使用起来有点费劲,但这里还是简单分享一下Log4Ne ...

  8. Log4Net日志记录介绍

    原文地址 : http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft . ...

  9. python添加fluent日志记录-aop

    python添加fluent日志,aop实现 1.配置fluent相关信息 fluent_config.ini fluent_config.ini [fluent.aop] #is support f ...

随机推荐

  1. 影响Acorn for Mac图像打印质量的因素有什么?怎样处理这些因素才能得到打印效果最佳的图像?

    Acorn for Mac是Mac OS平台上一款比较不错的图像处理软件.acorn mac版用起来都很像神器 Photoshop,是的,它的设计目标就是成为 Photoshop 的轻量替代者,拥有所 ...

  2. cocos2D-X 4.0 build

    { cmake . -G "Visual Studio 15 2017" cmake --build ./ }

  3. 深入理解Magento – 第十章、十一章(英文原版地址,仅供参考)

    深入理解Magento – 第十章 – Magento系统覆盖和升级 http://alanstorm.com/magento_upgrade_rewrite_override 深入理解MAGENTO ...

  4. 「NOI2016」循环之美 解题报告

    「NOI2016」循环之美 对于小数\(\frac{a}{b}\),如果它在\(k\)进制下被统计,需要满足要求并且不重复. 不重复我们确保这个分数是最简分数即\((a,b)=1\) 满足要求需要满足 ...

  5. [NOIP模拟14]题解

    当垃圾已经成为一种常态233333 A.旋转子段 考场上的$n^2$手残少了20分,555  (主要是因为实在打不出来$n^3$的做法所以写不了对拍?ccc为什么考场上没有想起有reverse()这么 ...

  6. Android_开发片段(Part 3)

    1.Android中的五种布局方式:线性布局(Linear Layout).相对布局(Relative Layout).表格布局(Table Layout).网格视图(Grid View).标签布局( ...

  7. 网络错误修复工具:Network Fault Repair Tool Build20160414

    ::请勿轻易修改此文件,以避免不可预知的错误 gwsbhqt@163.com @echo off color 0A setlocal enabledelayedexpansion title Netw ...

  8. SQL生成 C# Model

    本文转自: https://www.cnblogs.com/jhli/p/11552105.html declare @TableName sysname = 'T_FakeOrderList' de ...

  9. Linux上VNC 启动和关闭

    查询vnc的线程: [admin@cn2-uat-esb-01-0001 ~]$ ps -ef|grep vncadmin 19080 21305 0 10:04 pts/2 00:00:00 gre ...

  10. linux开机故障解决方法

    无法进grub方法1光盘或者网络引导进入Rescue切换原机系统 chroot /mnt/sysimage/ 安装grub grub-install /dev/sda 方法2 直接命令 grub-in ...