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. Kotlin学习笔记

    Kotlin的注释 Kotlin 的代码注释和Java一模一样 Kotlin的运行方式也是先kotlinc生成字节码,再kotlin字节码 如果一行里面只有一条语句,那么可以不写分号.但如果打算在同一 ...

  2. Java分支结构

    Java 分支结构 - if...else/switch 顺序结构只能顺序执行,不能进行判断和选择,因此需要分支结构. Java有两种分支结构: if语句 switch语句 if语句 一个if语句包含 ...

  3. Http请求工具类 httputil

    package com.snowfigure.kits.net; import java.io.BufferedReader; import java.io.IOException; import j ...

  4. luoguP1290 欧几里德的游戏 [博弈论]

    题目描述 欧几里德的两个后代Stan和Ollie正在玩一种数字游戏,这个游戏是他们的祖先欧几里德发明的.给定两个正整数M和N,从Stan开始,从其中较大的一个数,减去较小的数的正整数倍,当然,得到的数 ...

  5. 【LeetCode 10】正则表达式匹配

    题目链接 [题解] 看到这个题解 写的代码. 就是加个备忘录法.优化一下暴力的做法. 匹配的时候如果遇到号的话,就两种可能.不再考虑它前面一个字符了. 跳过这个或者.或者继续用前面那个字符匹配. 即d ...

  6. Linux 常用的一些操作

    1.查看linux中某个端口是否被占用 1> 使用lsof lsof -i:端口号      查看该端口是否被占用 2> 使用netstat netstat -antpu |grep 80 ...

  7. BZOJ 2655: calc(拉格朗日插值)

    传送门 解题思路 首先比较容易能想到\(dp\),设\(f[i][j]\)表示前\(j\)个数,每个数\(<=i\)的答案,那么有转移方程:\(f[i][j]=f[i-1][j-1]*i*j+f ...

  8. Ext 选项卡面板TabPanel

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. JAVA调用R脚本

    0 前言R是一种非常方便易用的绘图.统计分析.ML算法设计方面的脚本语言.实际中有这样一种场景:算法工程师用R搭建了机器学习算法模型,想用于javaweb之中但是又不想重新用java写一遍算法模型,那 ...

  10. 戏说 .NET GDI+系列学习教程(三、Graphics类的方法的总结)