.net 项目如何添加log4net日志记录
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 ...
随机推荐
- mongodb的学习 (2)
1.条件查询 查询姓名为小明的学生 db.local.find({name:'小明'});; 查询英语成绩大于90分的同学 ...
- Ansible自动化部署K8S集群
Ansible自动化部署K8S集群 1.1 Ansible介绍 Ansible是一种IT自动化工具.它可以配置系统,部署软件以及协调更高级的IT任务,例如持续部署,滚动更新.Ansible适用于管理企 ...
- flexbox布局一
flexbox布局是一种新的css布局,flex是flexible的简写,所以flexbox就可以理解为可伸缩布局.而可伸缩性也是flexbox布局的亮点,至于如何可伸缩,看完下面的介绍大家应该就会有 ...
- 转载 如何理解API,API 是如何工作的
本文转载于https://blog.csdn.net/cumtdeyurenjie/article/details/80211896 感谢作者 仁杰兄 大家可能最近经常听到 API 这个概念,那什么是 ...
- leetcode-168周赛-1298-你能从盒子中获得的最大糖果数
题目描述: 方法一:bfs class Solution: def maxCandies(self, status: List[int], candies: List[int], keys: List ...
- Vue学习笔记【13】——键盘修饰符以及自定义键盘修饰符
1.x版本中自定义键盘修饰符[了解] Vue.directive('on').keyCodes.f2 = 113; 2.x版本中自定义键盘修饰符 通过Vue.config.keyCodes.名称 = ...
- 后端获取前端的多个数据用getlist
authors = request.POST.getlist("authors") print(authors) 得到一串作者的名字
- 搭建appium自动化测试环境
注意:请使用不用的手机测试,appium会把微信app重新安装,记录都会清除 一.安装Java JDK JDK下载地址:https://www.oracle.com/technetwork/java/ ...
- (16)centos7 日志文件
常见日志文件 开机启动日志,只会记录本次信息 /var/log/boot.log 计划任务日志 /var/log/cron 开机内核检测信息 /var/log/dmesg 账号登录信息 /var/lo ...
- 导入安全证书到jdk
一:.导入证书 1.打开doc窗口,打开cmd,执行命令: keytool -import -file f:\ca.crt -keystore "%JAVA_HOME%\jre\lib\se ...