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".log"" />
<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".log"" />
<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日志记录的更多相关文章
-
.NET Worker Service 添加 Serilog 日志记录
前面我们了解了 .NET Worker Service 的入门知识[1] 和 如何优雅退出 Worker Service [2],今天我们接着介绍一下如何为 Worker Service 添加 Ser ...
-
python添加fluent日志记录
istio默认会进行日志的记录,但是仅仅记录到服务.以及服务之间调用的信息,不记录业务日志. 如: 所以需要添加业务日志记录. 1.python引入package fluentmsgpack 2.代码 ...
-
springboot添加fluent日志记录
istio默认会进行日志的记录,但是仅仅记录到服务.以及服务之间调用的信息,不记录业务日志. 如: 所以需要添加业务日志记录. 1.引入依赖 <dependency> <gr ...
-
log4net日志记录
这里是接着上一篇来优化的,上篇:ASP.NET MVC中错误日志信息记录 log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件,数据库,EventLog等),日志就是程序的黑 ...
-
Log4Net日志记录两种方式
简介 log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具. log4net是Ap ...
-
C#Log4net日志记录组件的使用
一.Log4Net介绍 Log4net是基于.NET开发的一款非常著名的记录日志开源组件.它通过一套XML配置的日志引擎,将日志分不同的等级,分别是:FATAL . ERROR. WARN. INFO ...
-
ASP.NET MVC4中加入Log4Net日志记录功能
前言 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging等,虽然多多少少使用起来有点费劲,但这里还是简单分享一下Log4Ne ...
-
Log4Net日志记录介绍
原文地址 : http://www.cnblogs.com/wolf-sun/p/3347373.html#3009010 简介 log4net库是Apache log4j框架在Microsoft . ...
-
python添加fluent日志记录-aop
python添加fluent日志,aop实现 1.配置fluent相关信息 fluent_config.ini fluent_config.ini [fluent.aop] #is support f ...
随机推荐
-
Java import以及Java类的搜索路径
如果你希望使用Java包中的类,就必须先使用import语句导入.import语句与C语言中的 #include 有些类似,语法为: import package1[.package2-].cl ...
-
iOS中UITableView使用总结
链接:http://www.open-open.com/lib/view/open1430008922468.html
-
***电商数据库设计参考:ecshop数据库+订单表结构等
ecshop订单表结构ecs_order_info说明 -- 表的结构 `ecs_order_info` CREATE TABLE IF NOT EXISTS `ecs_order_info` ...
-
百度地图API应用实践(一) —— 栅格图(草稿)
概述 运用百度地图JS API,实现了在百度地图上绘制栅格并按统计值渲染栅格颜色.实现的过程是不断补习的过程,其中用到一些技术,是个人首次尝试.包括:(1)简单的jQuery语法,并实现Ajax:(2 ...
-
[算法]动态规划(Dynamic programming)
转载请注明原创:http://www.cnblogs.com/StartoverX/p/4603173.html Dynamic Programming的Programming指的不是程序而是一种表格 ...
-
win10 iis 创建新站点注意事项
新建站点时:注意文件夹权限增加everyone. 快速打开IIS:win+r:inetmgr
-
centos 6.3安装ssh
centos 6.3安装ssh 安装ssh服务器端软件 yum install openssh-server 安装ssh客户端软件 yum install openssh-clients ...
-
java基础梳理--朝花夕拾(二)
1.Java语言语法规则和文件格式: 第一个Java程序:/** 第一个Java程序:控制台输出Hello world!*/public class Test{ //访问修饰符 class关键词 ...
-
SunRain
系统学习了半年java 开始业务攻坚 学习占缓 拼凑一个前后端分离的小项目 慢慢优化 https://gitee.com/fleam/SunRain.git
-
将远程UI分支克隆到本地UI分支
git checkout -b UI git remote add origin <url> git fetch origin git branch --track UI origin/U ...