使用log4Net可以将系统听日志保存到DB、日志文件、邮箱中等,本文介绍这三种三方式。
生产关系log4Net的配置文件结构中下;
Log4Net把日志保存到数据库和发Email的例子
通过Log4Net把日志保存到数据库和发送Email通知的例子,本例子运行在SQL SERVER上
上述配置好后,即可封闭成组件。首先要在将要封闭成的组件中引用log4Net.dll文件
组件代码如下:
[color=red]注意:要在这个封闭的项目下的AssemblyInfo.cs文件中加下:[/color]
生产关系log4Net的配置文件结构中下;
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="HR.Class.Log" type="HR.Class.Log.Config.HR.Class.LogConfigurationSectionHandler,HR.Class.Log" />
</configSections>
<HR.Class.Log>
<!--HRAdoNet:将日志写入数据库表-->
<appender name="HRAdoNet" type="HR.Class.Log.Appender.ADONetAppender">
<param name="BufferSize" value="50" /><!-- 当日志达到50条时进行一次写库操作-->
<!--写入数据库的分段大小-->
<param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<param name="ConnectionString" value="Server=localhost;Database=AuditSystem;User ID=sa;Password=system;Trusted_Connection=False" />
<param name="CommandType" value="StoredProcedure" />
<param name="CommandText" value="sp_HR_Log" />
<!--spLog_Create:存储过程名称-->
<param name="Parameter">
<param name="ParameterName" value="@log_date" />
<param name="DbType" value="DateTime" />
<param name="Layout" type="HR.Class.Log.Layout.RawTimeStampLayout" />
</param>
<param name="Parameter">
<param name="ParameterName" value="@thread" />
<param name="DbType" value="String" />
<param name="Size" value="255" />
<param name="Layout" type="HR.Class.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%t" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@log_level" />
<param name="DbType" value="String" />
<param name="Size" value="50" />
<param name="Layout" type="HR.Class.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%p" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@logger" />
<param name="DbType" value="String" />
<param name="Size" value="255" />
<param name="Layout" type="HR.Class.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%c" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@message" />
<param name="DbType" value="String" />
<param name="Size" value="4000" />
<param name="Layout" type="HR.Class.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%m" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@exception" />
<param name="DbType" value="String" />
<param name="Size" value="2000" />
<param name="Layout" type="HR.Class.Log.Layout.ExceptionLayout" />
</param>
</appender>
<!--HRSMTPAppender:将日志发送邮件-->
<appender name="HRSMTPAppender" type="HR.Class.Log.Appender.SMTPAppender">
<authentication value="Basic" />
<To value="xzbwww@126.com"/>
<From value="it_fighter@163.com" />
<Subject value="财务数据审计分析系统:日志" />
<SmtpHost value="smtp.163.com" />
<Username value="it_fighter@163.com" />
<Password value="sgj13002945392" />
<param name="BufferSize" value="10" />
<param name="Lossy" value="true" />
<evaluator type="HR.Class.Log.Core.LevelEvaluator">
<param name="Threshold" value="Fatal" />
</evaluator>
<layout type="HR.Class.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%newline%date [%thread] %-5level %logger [%property{NDC}] - %message%newline%newline%newline" />
</layout>
</appender>
<!--LocalFileAppender:将日志写入本地文件-->
<appender name="LocalFileAppender" type="HR.Class.Log.Appender.RollingFileAppender">
<param name="File" value="System\SystemLog.Log" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="10" />
<param name="MaximumFileSize" value="5MB" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="HR.Class.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="HRAdoNet" />
<appender-ref ref="HRSMTPAppender" />
<appender-ref ref="LocalFileAppender" />
</root>
</HR.Class.Log>
</configuration>
Log4Net把日志保存到数据库和发Email的例子
通过Log4Net把日志保存到数据库和发送Email通知的例子,本例子运行在SQL SERVER上
1. 建立数据库的表和存储过程
CREATE TABLE [dbo].[LogTest] (
[LogID] [int] IDENTITY (1, 1) NOT NULL ,
[LogDate] [datetime] NOT NULL ,
[LogThread] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[LogLevel] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Logger] [varchar] (255) COLLATE Chinese_PRC_CI_AS NULL ,
[LogMessage] [varchar] (4000) COLLATE Chinese_PRC_CI_AS NULL ,
[LogException] [varchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
CREATE PROCEDURE dbo.spLog_Create
@log_date datetime,
@thread varchar(255),
@log_level varchar(50),
@logger varchar(255),
@message varchar(4000),
@exception varchar(2000)
as
INSERT INTO LogTest
(
LogDate,
LogThread,
LogLevel,
Logger,
LogMessage,
LogException
)
VALUES
(
@log_date,
@thread,
@log_level,
@logger,
@message,
@exception
)
GO
2. Log4Net的配置
在Web.Config或App.Config文件的内容
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Xipu.Com.Log" type="Xipu.Com.Log.Config.Xipu.Com.LogConfigurationSectionHandler,Xipu.Com.Log" />
</configSections>
<Xipu.Com.Log>
<appender name="MyADO" type="Xipu.Com.Log.Appender.ADONetAppender">
<param name="BufferSize" value="100" />
<param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
<param name="ConnectionString" value="Server=localhost;Database=Test;User ID=sa;Password=sa;Trusted_Connection=False" />
<param name="CommandType" value="StoredProcedure" />
<param name="CommandText" value="spLog_Create" />
<param name="Parameter">
<param name="ParameterName" value="@log_date" />
<param name="DbType" value="DateTime" />
<param name="Layout" type="Xipu.Com.Log.Layout.RawTimeStampLayout" />
</param>
<param name="Parameter">
<param name="ParameterName" value="@thread" />
<param name="DbType" value="String" />
<param name="Size" value="255" />
<param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%t" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@log_level" />
<param name="DbType" value="String" />
<param name="Size" value="50" />
<param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%p" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@logger" />
<param name="DbType" value="String" />
<param name="Size" value="255" />
<param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%c" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@message" />
<param name="DbType" value="String" />
<param name="Size" value="4000" />
<param name="Layout" type="Xipu.Com.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%m" />
</param>
</param>
<param name="Parameter">
<param name="ParameterName" value="@exception" />
<param name="DbType" value="String" />
<param name="Size" value="2000" />
<param name="Layout" type="Xipu.Com.Log.Layout.ExceptionLayout" />
</param>
</appender>
<appender name="SMTPAppender" type="Xipu.Com.Log.Appender.SMTPAppender">
<BufferSize value="1" />
<param name="To" value="dengzebo@163.com"/>
<param name="From" value="dengzebo@cdce.cn" />
<Subject value="Xipu.Com.Log Error Message" />
<SMTPHost value="mail.cdce.cn" />
<Username value="dengzebo" />
<Password value="ILOVEYOU" />
<param name="LocationInfo" value="false" />
<param name="BufferSize" value="5" />
<!--说明: "BufferSize"设置日志缓存,存储到512后一起一个Email发送,如不设此项,每记一个日志,发一条Email-->
<!-- <param name="Lossy" value="true" />
<evaluator type="Xipu.Com.Log.spi.LevelEvaluator">
<param name="Threshold" value="WARN" />
</evaluator>
-->
<layout type="Xipu.Com.Log.Layout.PatternLayout">
<param name="ConversionPattern" value="%n%d [%t] %-5p %c [%x] - %m%n%n%n" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="MyADO" />
<appender-ref ref="SMTPAppender" />
</root>
</Xipu.Com.Log>
</configuration>
3. 在AssemblyInfo.cs文件中加入以下行:
[assembly: Xipu.Com.Log.Config.XmlConfigurator(ConfigFile = "App.config", ConfigFileExtension = "config", Watch = true)]
4. 编写测试代码:
Xipu.Com.Log.ILog log = Xipu.Com.Log.LogManager.GetLogger("MyLoggerTest");
try
{
log.Info("这是hansong的LOG INFO测试!");
log.Debug("这是hansong的LOG DEBUG测试!");
throw new Exception("这是hansong的LOG ERROR测试!");
}
catch (Exception er)
{
log.Error("错误日志", er);
}
5.其它文档资料
上述配置好后,即可封闭成组件。首先要在将要封闭成的组件中引用log4Net.dll文件
组件代码如下:
[color=red]注意:要在这个封闭的项目下的AssemblyInfo.cs文件中加下:[/color]
[assembly:HR.Class.Log.Config.XmlConfigurator(ConfigFile="App.config",ConfigFileExtension="config",Watch=true)]
namespace HR.Class.Log.WriteLog
{
/// <summary>
/// 当出现错误时,必须指定日志的类型,一般应用于系统出现错误后,
/// 如在Catch中用它,无论错误是普通的还是致命的
/// </summary>
public enum ErrorLogType
{
/// <summary>
/// 致命的错误
/// </summary>
FatalLog,
/// <summary>
/// 错误的错误
/// </summary>
ErrorLog
}
/// <summary>
/// 当需要提示时,必须指定日志的类型,一般应用于当系统提示用户怎样操作,
/// 哪怕是警告类操作,都应该用此类型
/// </summary>
public enum NoramlLogType
{
/// <summary>
/// 普通操作日志
/// </summary>
InfoLog,
/// <summary>
/// 警告日志
/// </summary>
WarnLog,
/// <summary>
/// 调试日志
/// </summary>
DebugLog
}
public static class WriteLog
{
public static void Write(string ModuleClassName, string FunctionName, string ErrorString, Exception Ex, HR.Class.Log.WriteLog.ErrorLogType LogType)
{
try
{
HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[" + ModuleClassName + "].[" + FunctionName + "]");
if (LogType == HR.Class.Log.WriteLog.ErrorLogType.ErrorLog)
{
log.Error(ErrorString, Ex);
}
else if (LogType == HR.Class.Log.WriteLog.ErrorLogType.FatalLog)
{
log.Fatal(ErrorString, Ex);
}
}
catch(Exception ET)
{
HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[HR.Class.Log.WriteLog].[Write]:ErrorLogType");
log.Error("写入日志时出错" + "[" + ModuleClassName + "].[" + FunctionName + "]", ET);
}
}
public static void Write(string ModuleClassName, string FunctionName, string Infostring, HR.Class.Log.WriteLog.NoramlLogType LogType)
{
try
{
HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[" + ModuleClassName + "].[" + FunctionName + "]");
if (LogType == HR.Class.Log.WriteLog.NoramlLogType.InfoLog)
{
log.Info(Infostring);
}
else if (LogType == HR.Class.Log.WriteLog.NoramlLogType.WarnLog)
{
log.Warn(Infostring);
}
else if (LogType == HR.Class.Log.WriteLog.NoramlLogType.DebugLog)
{
log.Debug(Infostring);
}
}
catch (Exception ex)
{
HR.Class.Log.ILog log = HR.Class.Log.LogManager.GetLogger("[HR.Class.Log.WriteLog].[Write]:ErrorLogType");
log.Error("写入日志时出错" + "[" + ModuleClassName + "].[" + FunctionName + "]", ex);
}
}
}
}