Log4net 数据库存储(四)
2024-09-28 01:30:59
1.新建一个空的ASP.Net 空项目,然后添加Default.aspx窗体
2.添加配置文件:log4net.config
<?xml version="1.0" encoding="utf-8"?>
<configuration> <system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web> <configSections>
<!--添加配置节点-->
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections> <log4net>
<!--定义输出到数据库-->
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
<!--日志缓存写入条数-->
<!--bufferSize表示批处理的日志事件,可以避免每次日志事件都访问数据库,原本是<bufferSize value="" />一百条才插入-->
<bufferSize value="" />
<!--日志数据库连接串-->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<connectionString value="DATABASE=log4netDB;SERVER=DESKTOP-F0T373H\WZH;UID=sa;PWD=18855162320;Connect Timeout=15;" />
<!--日志数据库脚本-->
<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[UserID],[UserName],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger,@UserId,@UserName, @message, @exception)" />
<!--日志时间LogDate -->
<parameter>
<parameterName value="@log_date" />
<dbType value="DateTime" />
<layout type="log4net.Layout.RawTimeStampLayout" />
</parameter>
<parameter>
<parameterName value="@thread" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%thread" />
</layout>
</parameter>
<!--日志类型LogLevel -->
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level" />
</layout>
</parameter>
<!--日志对象LogLogger -->
<parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<!--自定义UserId -->
<parameter>
<parameterName value="@UserId" />
<dbType value="String" />
<size value="" />
<layout type="log4net保存到数据库中.MyLayout">
<conversionPattern value="%Property{UserID}" />
</layout>
</parameter>
<!--自定义UserName -->
<parameter>
<parameterName value="@UserName" />
<dbType value="String" />
<size value="" />
<layout type="log4net保存到数据库中.MyLayout">
<conversionPattern value="%Property{UserName}" />
</layout>
</parameter>
<!--日志信息Message -->
<!--<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message" />
</layout>
</parameter>-->
<!--自定义Message -->
<parameter>
<parameterName value="@Message" />
<dbType value="String" />
<size value="" />
<layout type="log4net保存到数据库中.MyLayout">
<conversionPattern value="%Property{Message}" />
</layout>
</parameter>
<!--异常信息Exception -->
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter>
</appender>
<root>
<!--配置可输出日志级别-->
<level value="all"/>
<!--应用配置-->
<appender-ref ref="AdoNetAppender"/>
</root>
</log4net> </configuration>
3.在项目中的Properties中AssemblyInfo.cs的末尾添加
[assembly: log4net.Config.XmlConfigurator(ConfigFile = "log4net.config", Watch = true)]
4.添加实体类:LogEntity.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace log4net保存到数据库中
{
public class LogEntity
{
public string UserID { get; set; }
public string UserName { get; set; } public string Message { get; set; }
}
}
5.添加扩展类:MyPatternConverter.cs , MyLayout.cs 来扩展PatternLayout
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net.Layout.Pattern;
using System.Reflection; namespace log4net保存到数据库中
{
public class MyPatternConverter:PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{
if (Option != null)
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
else
WriteDictionary(writer, loggingEvent.Repository, loggingEvent.GetProperties());
} //通过反射获取传入的日志对象的某个属性的值
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;
}
}
}
MyPatternConverter.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net.Layout; namespace log4net保存到数据库中
{
public class MyLayout:PatternLayout
{
public MyLayout()
{
this.AddConverter("Property", typeof(MyPatternConverter));
}
}
}
MyLayout.cs
6.添加使用类:LogHelper.cs
using System;
using System.Diagnostics;
using System.IO; using log4net; namespace log4net保存到数据库中
{
public class LogHelper
{
/// <summary>
/// LoggerName
/// </summary>
public static string LoggerName = string.Empty;
/// <summary>
/// 用户ID
/// </summary>
public static string UserID = string.Empty;
/// <summary>
/// 用户名称
/// </summary>
public static string UserName = string.Empty; private static ILog iLog;
private static LogEntity logEntity; /// <summary>
/// 接口
/// </summary>
private static ILog log
{
get
{ if (iLog == null)
{
iLog = log4net.LogManager.GetLogger(LoggerName);
}
else
{
if (iLog.Logger.Name != LoggerName)
{
iLog = log4net.LogManager.GetLogger(LoggerName);
}
} return iLog;
}
} /// <summary>
/// 构造消息实体
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
private static LogEntity BuildMessageMode(string message)
{
if (logEntity == null)
{
logEntity = new LogEntity();
logEntity.UserID = UserID;
logEntity.UserName = UserName;
logEntity.Message = message;
}
else
logEntity.Message = message; return logEntity;
} /// <summary>
/// 调试
/// </summary>
/// <param name="message">消息</param>
public static void Debug(string message)
{
if (log.IsDebugEnabled)
log.Debug(BuildMessageMode(message));
} /// <summary>
/// 调试
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Debug(string message, Exception ex)
{
if (log.IsDebugEnabled)
log.Debug(BuildMessageMode(message), ex);
} /// <summary>
/// 信息
/// </summary>
/// <param name="message">消息</param>
public static void Info(string message)
{
if (log.IsInfoEnabled)
log.Info(BuildMessageMode(message));
} /// <summary>
/// 信息
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Info(string message, Exception ex)
{
if (log.IsInfoEnabled)
log.Info(BuildMessageMode(message), ex);
} /// <summary>
/// 一般错误
/// </summary>
/// <param name="message">消息</param>
public static void Error(string message)
{
if (log.IsErrorEnabled)
log.Error(BuildMessageMode(message));
} /// <summary>
/// 一般错误
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Error(string message, Exception exception)
{
if (log.IsErrorEnabled)
log.Error(BuildMessageMode(message), exception);
} /// <summary>
/// 警告
/// </summary>
/// <param name="message">消息</param>
public static void Warn(string message)
{
if (log.IsWarnEnabled)
log.Warn(BuildMessageMode(message));
} /// <summary>
/// 警告
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Warn(string message, Exception ex)
{
if (log.IsWarnEnabled)
log.Warn(BuildMessageMode(message), ex);
} /// <summary>
/// 严重
/// </summary>
/// <param name="message">消息</param>
public static void Fatal(string message)
{
if (log.IsFatalEnabled)
log.Fatal(BuildMessageMode(message));
} /// <summary>
/// 严重
/// </summary>
/// <param name="message">消息</param>
/// <param name="exception">异常</param>
public static void Fatal(string message, Exception ex)
{
if (log.IsFatalEnabled)
log.Fatal(BuildMessageMode(message), ex);
}
}
}
LogHelper.cs
7.在Default.aspx.cs中使用:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using log4net; namespace log4net保存到数据库中
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
LogHelper.LoggerName = typeof(Default).ToString();
LogHelper.UserID = "";
LogHelper.UserName = "me";
int i = ;
try
{ int b = / i;
}
catch (Exception ex)
{
LogHelper.Error(ex.Message, ex);
}
LogHelper.Fatal("Fatal",new Exception("异常信息"));
LogHelper.Info("Info");
LogHelper.Warn("Warn");
LogHelper.Debug("Debug");
}
}
}
Default.aspx.cs
8.配置数据库SQL Server2012:创建数据库log4netDB
CREATE TABLE [dbo].[Log] (
[Id] [int] IDENTITY (, ) NOT NULL,
[Date] [datetime] NOT NULL,
[Thread] [varchar] () NOT NULL,
[Level] [varchar] () NOT NULL,
[Logger] [varchar] () NOT NULL,
[UserID] [varchar] () NOT NULL,
[UserName] [varchar] () NOT NULL,
[Message] [varchar] () NOT NULL,
[Exception] [varchar] () NULL
)
sql语句
9.运行
10.帮助文档:
http://www.cnblogs.com/izreo/p/5651139.html
http://www.cnblogs.com/jiajinyi/p/5884930.html
最新文章
- Hive On Spark概述
- Linux进程管理、任务管理
- Kindeditor 代码审计
- C++-多重继承的注意点
- ERP_Oracle Erp 11i 和 R12的区别概述(概念)
- Your branch and &#39;origin/master&#39; have diverged
- 【JS】Beginner3 &; 4 &; 5 &; 6:Maths &; Logic &; Conditonal &; Looping
- WPF资源字典使用
- mfix模拟流化床燃烧帮助收敛的方法
- quartus ii有符号数的问题(待完善)
- swust oj 1051
- 你不知道的JS(3)来聊聊this
- hdu 4370
- impala系列: 字符串函数
- 百度AI--自然语言处理之Java开发
- Lintcode35-Reverse Linked List-Easy
- php-cgi和php-fpm,Windows环境下解决Nginx+php并发访问阻塞问题。
- 进阶之路(中级篇) - 018 基于arduino的简易版智能衣架
- result源码
- Java 常用对象-Date类和Calender类