log4net按等级多种方式记录日志
log4net.config
<?xml version="1.0"?>
<configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />
</configSections>
<log4net>
<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> <!--CREATE TABLE [dbo].[NatinalUnionLog](
[ID] [int] IDENTITY(,) NOT NULL,
[IP] [nvarchar]() NULL,
[sMessage] [nvarchar]() NULL,
[sMethod] [nvarchar]() NULL,
[User] [nvarchar]() NULL,
[dtDate] [datetime] NULL,
[sthread] [nvarchar]() NULL,
[sLevel] [nvarchar]() NULL,
[sLogger] [nvarchar]() NULL,
[sException] [nvarchar]() NULL,
CONSTRAINT [PK_NatinalUnionLog] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]-->
<bufferSize value="" />
<connectionString value="data source=.\sqlxu;initial catalog=NatinalUnionLog;Persist Security Info=True;User ID=sa;Password=101;Connect Timeout=1000" />
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b77a5c561934e089" />
<commandText value="INSERT INTO NatinalUnionLog ([IP],[sMessage],[sMethod],[User],[dtDate],[sThread],[sLevel],[sLogger],[sException]) VALUES (@IP,@message,@method, @user, @log_date, @thread, @log_level, @logger, @exception)" />
<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="%t" />
</layout>
</parameter>
<parameter>
<parameterName value="@log_level" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%p" />
</layout>
</parameter> <parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="NationalUnion.Common.Log.NationalUnionLayout">
<conversionPattern value="%o{message}" />
</layout>
</parameter> <parameter>
<parameterName value="@method" />
<dbType value="String" />
<size value="" />
<layout type="NationalUnion.Common.Log.NationalUnionLayout">
<conversionPattern value="%o{method}" />
</layout>
</parameter> <parameter>
<parameterName value="@IP" />
<dbType value="String" />
<size value="" />
<layout type="NationalUnion.Common.Log.NationalUnionLayout">
<conversionPattern value="%o{IP}" />
</layout>
</parameter> <parameter>
<parameterName value="@user" />
<dbType value="String" />
<size value="" />
<layout type="NationalUnion.Common.Log.NationalUnionLayout">
<conversionPattern value="%o{user}" />
</layout>
</parameter> <parameter>
<parameterName value="@logger" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%logger" />
</layout>
</parameter>
<!--<parameter>
<parameterName value="@message" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%m" />
</layout>
</parameter>-->
<parameter>
<parameterName value="@exception" />
<dbType value="String" />
<size value="" />
<layout type="log4net.Layout.ExceptionLayout" />
</parameter> </appender> <appender name="InfoLayout" type="log4net.Appender.RollingFileAppender,log4net"> <!--日志文件路径,“/”与“/”作用相同,到达的目录相同,文件夹不存在则新建 --> <!--按文件大小方式输出时在这里指定文件名,并且当天的日志在下一天时在文件名后自动追加当天日期形成新文件。--> <!--按照日期形式输出时,直接连接元素DatePattern的value形成文件路径。此处使用这种方式--> <!--param的名称,可以直接查对应的appender类的属性名即可,这里要查的就是RollingFileAppender类的属性 --> <param name="File" value="c:/Log/" />
<!--是否追加到文件-->
<param name="AppendToFile" value="true" />
<!--记录日志写入文件时,不锁定文本文件,防止多线程时不能写Log,官方说线程非安全-->
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<!--使用Unicode编码-->
<Encoding value="UTF-8" />
<!--最多产生的日志文件数,超过则只保留最新的n个。设定值value="-1"为不限文件数-->
<param name="MaxSizeRollBackups" value="-1" />
<!--是否只写到一个文件中-->
<param name="StaticLogFileName" value="false" />
<!--按照何种方式产生多个日志文件(日期[Date],文件大小[Size],混合[Composite])-->
<param name="RollingStyle" value="Date" />
<!--按日期产生文件夹和文件名[在日期方式与混合方式下使用]-->
<!--此处按日期产生文件夹,文件名固定。注意" 的位置-->
<param name="DatePattern" value="yyyy-MM-dd"info.log"" /> <!--<param name="DatePattern" value="yyyy-MM-dd/"ReflectionLayout.log"" />-->
<!--这是按日期产生文件夹,并在文件名前也加上日期-->
<!--<param name="DatePattern" value="yyyyMMdd/yyyyMMdd"-TimerServer.log"" />-->
<!--这是先按日期产生文件夹,再形成下一级固定的文件夹-->
<!--<param name="DatePattern" value="yyyyMMdd/"TimerServer/TimerServer.log"" />-->
<!--每个文件的大小。只在混合方式与文件大小方式下使用。超出大小后在所有文件名后自动增加正整数重新命名,数字最大的最早写入。可用的单位:KB|MB|GB。不要使用小数,否则会一直写入当前日志-->
<!--<param name="maximumFileSize" value="500KB" />-->
<!--计数类型为1,,…默认值为-。当文件超过MaximumFileSize的大小时,如果要创建新的文件来存储日志,会根据CountDirection的值来重命名文件。大于-1的值时,file里指定的文件名会依次加上.,.,.2递增。当等于或小于-1时,创建依赖于MaxSizeRollBackups参数值,创建备份日志数。-->
<!--<param name="CountDirection" value=""/>-->
<!--过滤设置,LevelRangeFilter为使用的过滤器。 -->
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="INFO" />
<param name="LevelMax" value="INFO" />
</filter>
<!--记录的格式。一般用log4net.Layout.PatternLayout布局-->
<!--此处用继承了log4net.Layout.PatternLayout的自定义布局,TGLog.ExpandLayout2为命名空间。%property{Operator}、%property{Action}是自定义的输出-->
<!--<layout type="TGLog.ExpandLayout2.ReflectionLayout,TGLog">
<param name="ConversionPattern" value="记录时间:%date 线程ID:[%thread] 日志级别:%-5level 记录类:%logger 操作者ID:%property{Operator} 操作类型:%property{Action}%n 当前机器名:%property%n当前机器名及登录用户:%username %n 记录位置:%location%n 消息描述:%property{Message}%n 异常:%exception%n 消息:%message%newline%n%n" />
</layout>-->
<layout type="NationalUnion.Common.Log.NationalUnionMemberLayout,NationalUnion.Common">
<header value=" --------------------------------------------------------------------------------------------------------------------------- " />
<param name="ConversionPattern" value="记录时间:%date 消息:%message 操作者ID:%property{UserID} IP:%property{IP}消息描述:%property{Description} 线程ID:[%thread] 日志级别:%-5level%newline" />
</layout>
</appender>
<appender name="ErrorLayout" type="log4net.Appender.RollingFileAppender,log4net">
<param name="File" value="c:/Log/" />
<param name="AppendToFile" value="true" />
<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
<Encoding value="UTF-8" />
<param name="MaxSizeRollBackups" value="-1" />
<param name="StaticLogFileName" value="false" />
<param name="RollingStyle" value="Date" />
<param name="DatePattern" value="yyyy-MM-dd"Error.log"" />
<filter type="log4net.Filter.LevelRangeFilter">
<param name="LevelMin" value="ERROR" />
<param name="LevelMax" value="ERROR" />
</filter>
<layout type="NationalUnion.Common.Log.NationalUnionMemberLayout,NationalUnion.Common">
<header value="--------------------------------------------------------------------------------------------------------------------------- " />
<param name="ConversionPattern" value="记录时间:%date 消息:%message 线程ID:[%thread] 日志级别:%-5level%n%exception%newline" />
</layout>
</appender> <!-- setup the root category, add the appenders and set the default level -->
<root>
<!--<level value="WARN"/>
<level value="INFO"/>
<level value="DEBUG"/>
<level value="FINE"/>-->
<level value="ALL"/>
<!--<appender-ref ref="AdoNetAppender" />--><!--关闭数据库记录日志功能-->
<appender-ref ref="InfoLayout" />
<appender-ref ref="ErrorLayout" />
</root> </log4net>
<!--Log4net End--> </configuration>
LogExtension.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Reflection;
using log4net.Layout.Pattern;
using log4net.Layout;
using log4net.Util; namespace NationalUnion.Common.Log
{
public class NationalUnionPatternConverter : PatternLayoutConverter
{
protected override void Convert(System.IO.TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
{ object obj = loggingEvent.MessageObject;
if (obj == null)
{
writer.Write(SystemInfo.NullText);
return;
}
if (Option == null)
{
writer.Write(obj.ToString());
return;
}
if (Option != null)
{
WriteObject(writer, loggingEvent.Repository, LookupProperty(Option, loggingEvent));
}
//throw new NotImplementedException();
} private object LookupProperty(string property, log4net.Core.LoggingEvent loggingEvent)
{
object propertyValue = string.Empty;
Type type = loggingEvent.MessageObject.GetType();
PropertyInfo propertyInfo = type.GetProperty(property);
if (propertyInfo != null)
propertyValue = propertyInfo.GetValue(loggingEvent.MessageObject, null); return propertyValue;
} } public class NationalUnionLayout : PatternLayout
{
public NationalUnionLayout()
{
this.AddConverter("o", typeof(NationalUnionPatternConverter));
}
}
public class NationalUnionMemberLayout : PatternLayout
{
public NationalUnionMemberLayout()
{
this.AddConverter("property", typeof(NationalUnionPatternConverter));
}
}
}
LogUtility.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using log4net.Appender;
using log4net.Layout; namespace NationalUnion.Common.Log
{
public static class Logger
{
public static ILog log; static Logger()
{
string strPath = HttpContext.Current.Server.MapPath("//");
strPath = System.IO.Path.Combine(strPath, "log");
strPath = System.IO.Path.Combine(strPath, "log4net.config");
System.IO.FileInfo log4file = new System.IO.FileInfo(strPath);
log4net.Config.XmlConfigurator.Configure(log4file);
log = LogManager.GetLogger("AdoNet");
} /// <summary>
/// 将日志记录到数据库中,缺省值都为空,需要开发人员填充
/// </summary>
/// <param name="message">日志信息</param>
/// <param name="Ip">IP地址</param>
/// <param name="user">用户账号</param>
/// <param name="methodname">当前的方法名称</param>
public static void InfoMessage(string message = "", string Ip = "", string user = "", string methodname = "")
{
if (message == null || Ip == null || user == null || methodname == null)
log.Info(new { message = "null param" });
else
{
log.Info(new { message = message, IP = Ip, user = user, method = methodname });
}
} /// <summary>
/// 将异常信息记录到数据库中,缺省值都为空,需要开发人员填充
/// </summary>
/// <param name="ex">异常实例</param>
/// <param name="message">日志信息</param>
/// <param name="Ip">IP地址</param>
/// <param name="user">用户账号</param>
/// <param name="methodname">方法名称</param>
public static void InfoMessageWithEx(System.Exception ex, string message = "", string Ip = "", string user = "", string methodname = "")
{
if (message == null || Ip == null || user == null || methodname == null)
{
log.Info(new { message = "null param" });
}
else
{
if (ex != null)
{
log.Warn(new { message = message, IP = Ip, user = user, method = methodname }, ex);
}
else
{
log.Info(new { message = message, IP = Ip, user = user, method = methodname });
}
}
} /// <summary>
/// 记录信息
/// </summary>
/// <param name="argUserID"></param>
/// <param name="argIP"></param>
/// <param name="argDescription"></param>
/// <param name="argMethod"></param>
public static void Info(long argUserID = , string argIP = "", string argDescription = "", string argMethod = "")
{
log.Info(new { UserID = argUserID, IP = argIP, Description = argDescription, Method = argMethod });
} /// <summary>
/// 记录错误
/// </summary>
/// <param name="argEx">异常信息</param>
/// <param name="argUserID">用户ID</param>
/// <param name="argIP">访问者IP</param>
/// <param name="argDescription">描述</param>
public static void LogError(System.Exception argEx, long argUserID = , string argIP = "", string argDescription = "")
{
log.Error(new { UserID = argUserID, IP = argIP, Description = argDescription }, argEx);
} /// <summary>
/// 记录错误
/// </summary>
/// <param name="argEx"></param>
/// <param name="argObj"></param>
public static void LogError(System.Exception argEx, object argObj)
{
log.Error(argObj, argEx);
}
}
}
调用方式:
try
{
int i = ;
int j = ;
int value = i / j;
}
catch (Exception e)
{
NationalUnion.Common.Log.Logger.LogError(e, this.MemberNo, this.IPAddress, "转换出错");
} NationalUnion.Common.Log.Logger.Info(this.MemberNo, this.IPAddress, "测试INfo", "NationalUnion.Member.Controllers.Index");
主要还是Filter里的设置记录的不同方式。
log配置文件
记录载图为:
更详细的参数说明参见
log4net按等级多种方式记录日志的更多相关文章
- jQuery绑定事件-多种方式实现
jQuery绑定事件-多种方式实现: <html> <head> <meta charset="utf-8" /> <script src ...
- idea打包jar的多种方式
这里总结出用IDEA打包jar包的多种方式,以后的项目打包Jar包可以参考如下形式: 用IDEA自带的打包形式 用Maven插件maven-shade-plugin打包 用Maven插件maven-a ...
- Java中测试异常的多种方式
使用JUnit来测试Java代码中的异常有很多种方式,你知道几种? 给定这样一个class. Person.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- Spring学习总结(一)——Spring实现IoC的多种方式
控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法,也有人认为DI只是IoC的另一种说法.没有IoC的程序中我们使用面向对象编程对象的创 ...
- PDO多种方式取得查询结果
PDO多种方式取得查询结果 01 December 2009 1:26 Tuesday by Sjolzy PDO最大的特点之一是它的灵活性,本节将介绍如何取得查询结果,包括: 数组(数值或关联数组) ...
- java 获取classpath下文件多种方式
java 获取classpath下文件多种方式 一:properties下配置 在resources下定义server.properties register.jks.path=classpath\: ...
- IOC和AOP使用扩展 多种方式实现依赖注入
多种方式实现依赖注入 1.Spring 使用setter访问器实现对属性的赋值, 2.Spring 构造constructor方法赋值, 3.接口注入 4.Spring P命名空间注入直接量 sett ...
- sql语句分页多种方式ROW_NUMBER()OVER
sql语句分页多种方式ROW_NUMBER()OVER 摘自: http://www.cnblogs.com/CodingArt/articles/1692468.html 方式一 select to ...
- JavaScript中判断为整数的多种方式
之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...
随机推荐
- 我们如何学好java
转载:http://www.zhihu.com/question/19945685 马士兵有一篇文章,我觉得写得很好,原文转载如下,希望题主可以好好读读. ---------------------- ...
- (四)java程序基本组成
一个基本的java程序一般包括几个部分,分别是程序所在的包名.程序中用到的其他包的路径.程序的类.类中的方法.变量和字面量. package demo; import java.util.Date; ...
- windows下boost库的基本使用方法
因为boost都是使用模板的技术,所以所有代码都是写在一个.hpp头文件中.这样boost中的大部分内容是不需要编译生成相应的链接库,只需要设置下面的包含目录(或者设置一下环境变量),在源文件中包含相 ...
- ubuntu修改grub界面默认开机顺序
终端输入: sudo gedit /etc/default/grub GRUB_DEFAULT代表的就是启动项的顺序,从数字0开始 修改成默认的第几个,就赋值成几就好(顺序从数字0开始) 然后别忘了运 ...
- BestCoder Round #84 Bellovin
Bellovin 题意: 给个中文链接:戳戳戳 题解: 这个题其实就是让你求每一位的最长公共子序列,之后输出就好了,求这个有2个算法,一个是n方,另一个nlogn,所以显然是nlogn的算法,其实这就 ...
- 在单线程中你最好使用ArrayList而不是Vector
<java核心技术卷一>571页上提到Vector类的所有方法都是同步的.可以由两个线程安全地访问同一个Vector对象.显然,如果可以确定我们不会在多个线程中对这个数组进行操作的话,我们 ...
- centos利用cloudflare的bpf-tools实现ddos防护
概念 利用BPF( Berkeley Packet Filter)工具集结合iptables的xt_bpf模块可以实现高性能包过滤,从而应对大规模的ddos攻击.BPF Tools包含一组简单的pyt ...
- Opencv 2.4.9在Ubuntu下的配置与安装
[原]Opencv 2.4.9在Ubuntu下的配置安装 Opencv 2.4.9在Ubuntu下的配置与安装 surgewong@gmail.com http://blog.csdn.net/su ...
- SpringMVC3的ResponseBody返回字符串(JSON)乱码问题解决
近日做一个小项目,用spring mvc 做到ajax请求获取jquery ztree 异步获取树返回json对象时出现了乱码,试了各种办法,查了各种资料,一开始以为是数据库的编码有问题,经测试没问题 ...
- [Java] File文件列表
package test.file; import java.io.File; import java.io.FilenameFilter; /** * 文件列表,文件过滤 * @author Fro ...