1)配置代码

<?xml version="1.0" encoding="utf-8" ?>

  <configuration>
<configSections>
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
</configSections> <log4net> <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
<!--日志路径-->
<param name= "File" value= "D:\App_Log\G2\"/>
<!--是否是向文件中追加日志-->
<param name= "AppendToFile" value= "true"/>
<!--log保留天数-->
<param name= "MaxSizeRollBackups" value= "10"/>
<!--日志文件名是否是固定不变的-->
<param name= "StaticLogFileName" value= "false"/>
<!--日志文件名格式为:2008-08-31.log-->
<param name= "DatePattern" value= "yyyy-MM-dd".read.log""/>
<!--日志根据日期滚动-->
<param name= "RollingStyle" value= "Date"/>
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n %loggername" />
</layout>
</appender> <!--<logger name="WebLogger">
<level value="INFO"/>
<appender-ref ref="ADONetAppender" /> </logger>--> <!--<logger name="WebTest">
<level value="INFO"/>
<appender-ref ref="ADONetTest" /> </logger>--> <!--SQL数据库-->
<appender name="ADONetAppender" type="log4net.Appender.ADONetAppender"> <bufferSize value="1"/> <!-- SQL数据源 -->
<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> <!-- SQL连接字符串-->
<connectionString value="data source=xxx.sqlserver.rds.aliyuncs.com,13433;initial catalog=dbtest;integrated security=False;persist security info=True;User ID=sa;Password=123" /> <commandText value="INSERT INTO ErrLog ([RecordTime],[LevelName],[Message],[Exception],[UserID]) VALUES (@log_date, @log_level, @message, @exception, @UserID)"/> <parameter>
<parameterName value="@log_date"/>
<dbType value="DateTime"/>
<layout type="log4net.Layout.RawTimeStampLayout"/>
</parameter> <parameter>
<parameterName value="@log_level"/>
<dbType value="String"/>
<size value="50"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%level"/>
</layout>
</parameter> <parameter>
<parameterName value="@exception"/>
<dbType value="String"/>
<size value="2000"/>
<layout type="log4net.Layout.ExceptionLayout"/>
</parameter> <parameter>
<parameterName value="@message"/>
<dbType value="String"/>
<size value="4000"/>
<layout type="log4net.Layout.PatternLayout">
<conversionPattern value="%message"/>
</layout>
</parameter> <!--自定义成员 -->
<parameter>
<parameterName value="@UserID" />
<dbType value="Int32" /> <layout type="G2.Log.CustomLayout">
<conversionPattern value="%UserId" />
</layout> </parameter> </appender> <root>
<!--(高) OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL (低) -->
<level value="all" />
<appender-ref ref="ADONetAppender"/>
<appender-ref ref="RollingLogFileAppender"/>
</root> </log4net> <startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
</startup> </configuration>

  

2)LogHelper

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using log4net;
using log4net.Core;
using log4net.Layout.Pattern; namespace G2.Log
{
public class LogMessage
{
public string Message { get; set; }
public int UserId { get; set; }
public override string ToString()
{
return Message;
}
} public class CustomLayout : log4net.Layout.PatternLayout
{
public CustomLayout()
{
this.AddConverter("UserId", typeof(UserIdPatternConverter)); }
}
internal sealed class UserIdPatternConverter : PatternLayoutConverter
{
override protected void Convert(TextWriter writer, LoggingEvent loggingEvent)
{
var logMessage = loggingEvent.MessageObject as LogMessage; if (logMessage != null)
{
writer.Write(logMessage.UserId);
}
}
}
public class LogHelper
{
public static string Path = System.Configuration.ConfigurationManager.AppSettings["log4net"] ;
public static string LoggerName = System.Configuration.ConfigurationManager.AppSettings["loggerName"];
static LogHelper()
{
if (string.IsNullOrEmpty(Path))
{
Path = AppDomain.CurrentDomain.BaseDirectory + "log4net.config"; }
if (string.IsNullOrEmpty(LoggerName))
{
LoggerName = "G2.Core"; }
} private static ILog _log; public static ILog Log
{
get
{
if (_log == null)
{
string path = Path;
log4net.Config.XmlConfigurator.Configure(new FileInfo(path));
_log = log4net.LogManager.GetLogger(LoggerName);
}
return _log; }
} /// <summary>
/// 调试
/// </summary>
public static void Debug(LogMessage message)
{
if (Log.IsDebugEnabled)
{
Log.Debug(message);
}
} /// <summary>
/// 错误
/// </summary>
public static void Error(LogMessage message, Exception ex)
{
if (Log.IsErrorEnabled)
{
Log.Error(message,ex);
}
} /// <summary>
/// 严重错误
/// </summary>
public static void Fatal(LogMessage message, Exception ex)
{
if (Log.IsFatalEnabled)
{
Log.Fatal(message);
}
} /// <summary>
/// 记录一般日志
/// </summary>
public static void Info(LogMessage message)
{
if (Log.IsInfoEnabled)
{
Log.Info(message);
}
} /// <summary>
/// 记录警告
/// </summary>
public static void Warn(LogMessage message)
{
if (Log.IsWarnEnabled)
{
Log.Warn(message);
}
} /// <summary>
/// 需要写日志的地方调用此方法
/// </summary> /// <param name="level">自定义级别</param>
/// <param name="logMessage">日志消息</param>
/// <param name="ex">异常</param>
public static void SaveMessage(LogLevel level,LogMessage logMessage, Exception ex)
{ switch (level)
{
case LogLevel.Debug :
Debug(logMessage);
break;
case LogLevel.Info:
Info(logMessage);
break; case LogLevel.Warn:
Warn(logMessage);
break; case LogLevel.Error:
Error(logMessage,ex);
break; case LogLevel.Fatal:
Fatal(logMessage,ex);
break; default: break;
}
} } public enum LogLevel
{
Debug=0,
Info=1,
Warn=2,
Error=3,
Fatal=4
}
}

  

3)调用

 class Program
{
static void Main(string[] args)
{
LogMessage log=new LogMessage();
log.UserId = 19;
log.Message = "asdfasd";
try
{
throw new Exception("一个空的引用对象");
}
catch (Exception ex)
{ LogHelper.SaveMessage( LogLevel.Error,log,ex); } Console.Read();
}
}

  

log4net 记录到数据库和本地文件的更多相关文章

  1. Log4Net记录到数据库

    WinForm下Log4Net的配置 Log4Net 组件下载地址 https://download.csdn.net/download/zgx123zgx123zg/10470986 configS ...

  2. 也用 Log4Net 之将日志记录到数据库的配置 (一)

    也用 Log4Net  之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需 ...

  3. Log4Net 之将日志记录到数据库的配置 (一)

    原文:Log4Net 之将日志记录到数据库的配置 (一) 前段时间我一直想做一个通用一点的日志记录系统,可以便于不同的业务组调用进行日志记录及分析.本来打算着自己下手写一个,后面发现各业务组可能会需要 ...

  4. 也用 Log4Net 之将日志记录到数据库的后台实现 (二)

    也用 Log4Net 之将日志记录到数据库的后台实现 (二)  大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之 ...

  5. C#中四步轻松使用log4net记录本地日志

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...

  6. C#中四步轻松使用log4net记录本地日志(WPF有点小区别)

    在这里,记录我在项目中使用log4net记录本地日志的步骤.在不会之前感觉很难,很神秘,一旦会了之后其实没那么难.其实所有的事情都是一样的,下面我就分享一下我使用log4Net的经验. 第一步:首先从 ...

  7. Log4Net 之将日志记录到数据库的后台实现 (二)

    原文:Log4Net 之将日志记录到数据库的后台实现 (二) 大家下午好,昨天讲了配置,今天我们讲讲后台实现,在完成了后台实现后,我们才能真正意义上的解决把自定义属性字段值录入到数据库中. 在开写之前 ...

  8. C#中使用Log4net日志输出到本地文件、Textbox或Listview

    网上很多配置log4net的方法,但是排行靠前的 根本就没有说明清除,导致浪费了两个小时来搞清楚如何配置,真是无语,特写此文,给那些刚接触log4net的朋友 1.参考链接:http://blog.s ...

  9. 两个简单的python文件,实现删除本地文件夹和mongodb数据库的内容

    删除本地文件夹: import os , string , datetime ; str = '/home/niuguoqin/tmp/tomcat/'; b = (datetime.datetime ...

随机推荐

  1. javascript代码片段

    DOMReady函数,只要DOM结构加载完成即可,不必等待所有资源加载完成,节约时间,"DOMContentLoaded"在H5中被标准化 var DOMReady=functio ...

  2. python列表下标用法

    python中的列表下标实在太灵活了,要根据表象来分析它的内在机理,这样用起来才能溜.下标可以为负数有利有弊,好处是使用起来更简便,坏处是当我下表越界了我也不知道反倒发生奇奇怪怪的错误. print ...

  3. mybatis resultMap映射学习笔记

    这几天,百度mybatis突然看不到官网了,不知道百度怎么整的.特此贴出mybatis中文官网: http://www.mybatis.org/mybatis-3/zh/index.html 一个学习 ...

  4. Windows10易升下载

    为了更好的帮助用户快速跨版本升级windows,退出Windows易升!在线下载,更新安装!网速快的话需要半个小时搞定! 升级完毕,如股票感觉OK.记得清理C盘Windows.old文件 01.磁盘- ...

  5. 在nginx中配置如何防止直接用ip访问服务器web server及server_name特性讲解

    看了很多nginx的配置,好像都忽略了ip直接访问web的问题,不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问,具体怎么做呢,看下面. 官方文档中提供的方法: If you d ...

  6. Oracle空串与null的处理

    来源于:http://blog.itpub.net/24870090/viewspace-1057853/ Oracle空串与null的处理[@more@] Oracle中的空字符串基本上是被当成空N ...

  7. Linux服务器配置git服务

    前言 Git是一个非常著名的分布式版本控制系统,而广大开发者更是习惯在最大的远程仓库GitHub上提交自己的代码.但是有时候,一些小项目不值得放到GitHub上去,或是由于隐私问题不好在GitHub的 ...

  8. Redis集群(一):基本概念

    一.使用版本:3.0.0.0 二.基本概念:  号至 11000 号的哈希槽, 这样集群就不会因为主节点 B 的下线而无法正常运作了. 异步复制(虽然是异步复制,但是执行写命令和复制命令到从节点几乎是 ...

  9. 系统间通信(9)——通信管理与RMI 下篇

    接上文<架构设计:系统间通信(8)--通信管理与RMI 上篇>.之前说过,JDK中的RMI框架在JDK1.1.JDK1.2.JDK1.5.JDK1.6+几个版本中做了较大的调整.以下我们讨 ...

  10. [cf621E]Wet Shark and Blocks

    Description 给定$n$个数和$b$个盒子,放一些数到盒子中,使得盒子不为空.每个盒子中的数是一样的,一个数可以被放到多个盒子中. 从每个盒子中取一个数,组成一个$b$位数,如果这个数$mo ...