一、数据库日志表结构

  1. CREATE TABLE [dbo].[WebLog_Msg](
  2. [LogID] [int] IDENTITY(1,1) NOT NULL,
  3. [Date] [datetime] NOT NULL,
  4. [Thread] [nvarchar](255) NULL,
  5. [Level] [nvarchar](50) NULL,
  6. [Logger] [nvarchar](255) NULL,
  7. [Message] [nvarchar](2000) NULL,
  8. [Exception] [nvarchar](4000) NULL,
  9. CONSTRAINT [PK_WebLog_Msg] PRIMARY KEY CLUSTERED
  10. (
  11. [LogID] ASC
  12. ))

二、测试类库LoggHelper

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using log4net;
  6. namespace LogHelper
  7. {
  8. public class LoggHelper
  9. {
  10. //static LoggHelper()
  11. //{
  12. //    log4net.Config.XmlConfigurator.Configure();
  13. //}
  14. private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(LoggHelper));
  15. public static void LogInfo()
  16. {
  17. log.Info("log日志getretertretrree");
  18. }
  19. public static void LogWarn()
  20. {
  21. log.Warn("log警告WARNaaaaaaaaaad;");
  22. }
  23. public static void LogFatal()
  24. {
  25. log.Fatal("log警告WARNaaaaaaaaaad;");
  26. }
  27. public static void LogError()
  28. {
  29. log.Error("log错误sfsfsfsdfafasdfdsfadffafdsaffasf><><>2eewewjklsfaaaaaaaaaaaaaaaaaaaaaaaaaaaaad;");
  30. }
  31. }
  32. }

三、控制台测试项目

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using LogHelper;
  6. namespace TestLog4Net
  7. {
  8. class Program
  9. {
  10. static void Main(string[] args)
  11. {
  12. log4net.Config.XmlConfigurator.Configure();
  13. try
  14. {
  15. LoggHelper.LogInfo();
  16. LoggHelper.LogWarn();
  17. LoggHelper.LogError();
  18. LoggHelper.LogFatal();
  19. Console.ReadLine();
  20. }
  21. catch (Exception ex)
  22. {
  23. Console.Write(ex);
  24. }
  25. }
  26. }
  27. }

配置文件内容如下:

  1. <?xml version="1.0"?>
  2. <configuration>
  3. <!--Log4Net config section-->
  4. <configSections>
  5. <!--<sectionGroup name="common">
  6. <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
  7. </sectionGroup>-->
  8. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  9. </configSections>
  10. <!--<common>
  11. <logging>
  12. <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
  13. <arg key="configType" value="INLINE"/>
  14. </factoryAdapter>
  15. </logging>
  16. </common>-->
  17. <log4net>
  18. <root>
  19. <!--OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->
  20. <level value="ALL"/>
  21. <appender-ref ref="AdoNetAppender_SqlServer"/>
  22. <appender-ref ref="RollingLogFileAppender"/>
  23. </root>
  24. <!--<logger name="ErrorInfo">
  25. <level value="ALL" />
  26. <appender-ref ref="RollingLogFileAppender" />
  27. </logger>-->
  28. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  29. <filter type="log4net.Filter.LevelRangeFilter">
  30. <levelMin value="Debug" />
  31. <levelMax value="Info" />
  32. </filter>
  33. <param name="File" value="log\errorInfo.txt"/>
  34. <param name="AppendToFile" value="true"/>
  35. <param name="MaxSizeRollBackups" value="10"/>
  36. <param name="MaximumFileSize" value="2MB"/>
  37. <param name="RollingStyle" value="Size"/>
  38. <param name="StaticLogFileName" value="true"/>
  39. <layout type="log4net.Layout.PatternLayout">
  40. <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
  41. </layout>
  42. </appender>
  43. <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
  44. <filter type="log4net.Filter.LevelRangeFilter">
  45. <levelMin value="Warn" />
  46. <levelMax value="Fatal" />
  47. </filter>
  48. <bufferSize value="0" />
  49. <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  50. <connectionString value="server=XXXXX;database=WebLog;user id=UID;password=PSW;Connect Timeout=15;"/>
  51. <commandText value="INSERT INTO WebLog_Msg([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
  52. <parameter>
  53. <parameterName value="@log_date" />
  54. <dbType value="DateTime" />
  55. <layout type="log4net.Layout.RawTimeStampLayout" />
  56. </parameter>
  57. <parameter>
  58. <parameterName value="@thread" />
  59. <dbType value="String" />
  60. <size value="255" />
  61. <layout type="log4net.Layout.PatternLayout">
  62. <conversionPattern value="%thread" />
  63. </layout>
  64. </parameter>
  65. <parameter>
  66. <parameterName value="@log_level" />
  67. <dbType value="String" />
  68. <size value="50" />
  69. <layout type="log4net.Layout.PatternLayout">
  70. <conversionPattern value="%level" />
  71. </layout>
  72. </parameter>
  73. <parameter>
  74. <parameterName value="@logger" />
  75. <dbType value="String" />
  76. <size value="255" />
  77. <layout type="log4net.Layout.PatternLayout">
  78. <conversionPattern value="%logger" />
  79. </layout>
  80. </parameter>
  81. <parameter>
  82. <parameterName value="@message" />
  83. <dbType value="String" />
  84. <size value="2000" />
  85. <layout type="log4net.Layout.PatternLayout">
  86. <conversionPattern value="%message" />
  87. </layout>
  88. </parameter>
  89. <parameter>
  90. <parameterName value="@exception" />
  91. <dbType value="String" />
  92. <size value="4000" />
  93. <layout type="log4net.Layout.ExceptionLayout" />
  94. </parameter>
  95. </appender>
  96. </log4net>
  97. <!--Log4Net config section end-->
  98. </configuration>

四、运行结果

1、文件

  1. 2011-12-31 14:40:17,440 [10] INFO  LogHelper.LoggHelper [(null)] - log日志getretertretrree

2、数据库

五、优化log4net在项目中的配置

关注封装日志操作的类库LogHelper:

在AssemblyInfo.cs文件中加入[assembly: log4net.Config.XmlConfigurator(ConfigFile = "Configuration/Log4Net.config", Watch = true)],即加入log4net配置项。

在文件Log4Net.config中配置如下:

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <!--Log4Net config section-->
  4. <configSections>
  5. <!--<sectionGroup name="common">
  6. <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging" />
  7. </sectionGroup>-->
  8. <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
  9. </configSections>
  10. <!--<common>
  11. <logging>
  12. <factoryAdapter type="Common.Logging.Log4Net.Log4NetLoggerFactoryAdapter, Common.Logging.Log4Net">
  13. <arg key="configType" value="INLINE"/>
  14. </factoryAdapter>
  15. </logging>
  16. </common>-->
  17. <log4net>
  18. <root>
  19. <!--OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL-->
  20. <level value="ALL"/>
  21. <appender-ref ref="AdoNetAppender_SqlServer"/>
  22. <appender-ref ref="RollingLogFileAppender"/>
  23. </root>
  24. <!--<logger name="ErrorInfo">
  25. <level value="ALL" />
  26. <appender-ref ref="RollingLogFileAppender" />
  27. </logger>-->
  28. <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
  29. <param name="File" value="log\errorInfo.txt"/>
  30. <param name="AppendToFile" value="true"/>
  31. <param name="MaxSizeRollBackups" value="10"/>
  32. <param name="MaximumFileSize" value="2MB"/>
  33. <param name="RollingStyle" value="Size"/>
  34. <param name="StaticLogFileName" value="true"/>
  35. <layout type="log4net.Layout.PatternLayout">
  36. <!--"%d %t %p %l %m %n”:
  37. 1、%d输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式,比如:%d{yyyy-MM-dd HH:mm:ss},输出类似:2005-7-19 17:49:27,刚好适合插入SQLServer;
  38. 2、%t  产生该日志事件的线程名;
  39. 3、%p 日志的log_level,如DEBUG、WARN或者INFO;
  40. 4、%c  输出所属的类目,通常就是所在类的全名,如“iNotes.Default”;
  41. 5、%m 日志的内容;
  42. 6、%l  输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数。如write2database.main(write2database.java:33);
  43. 7、%n  输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n”
  44. -->
  45. <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n"/>
  46. </layout>
  47. </appender>
  48. <appender name="AdoNetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
  49. <filter type="log4net.Filter.LevelRangeFilter">
  50. <levelMin value="Warn" />
  51. <levelMax value="Fatal" />
  52. </filter>
  53. <bufferSize value="0" />
  54. <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
  55. <connectionString value="server=XXXX;database=Weblog;user id=UID;password=PSW"/>
  56. <commandText value="INSERT INTO WebLog_Msg([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
  57. <parameter>
  58. <parameterName value="@log_date" />
  59. <dbType value="DateTime" />
  60. <layout type="log4net.Layout.RawTimeStampLayout" />
  61. </parameter>
  62. <parameter>
  63. <parameterName value="@thread" />
  64. <dbType value="String" />
  65. <size value="255" />
  66. <layout type="log4net.Layout.PatternLayout">
  67. <conversionPattern value="%thread" />
  68. </layout>
  69. </parameter>
  70. <parameter>
  71. <parameterName value="@log_level" />
  72. <dbType value="String" />
  73. <size value="50" />
  74. <layout type="log4net.Layout.PatternLayout">
  75. <conversionPattern value="%level" />
  76. </layout>
  77. </parameter>
  78. <parameter>
  79. <parameterName value="@logger" />
  80. <dbType value="String" />
  81. <size value="255" />
  82. <layout type="log4net.Layout.PatternLayout">
  83. <conversionPattern value="%logger" />
  84. </layout>
  85. </parameter>
  86. <parameter>
  87. <parameterName value="@message" />
  88. <dbType value="String" />
  89. <size value="255" />
  90. <layout type="log4net.Layout.PatternLayout">
  91. <conversionPattern value="%message" />
  92. </layout>
  93. </parameter>
  94. <parameter>
  95. <parameterName value="@exception" />
  96. <dbType value="String" />
  97. <size value="4000" />
  98. <layout type="log4net.Layout.ExceptionLayout" />
  99. </parameter>
  100. </appender>
  101. </log4net>
  102. <!--Log4Net config section end-->
  103. </configuration>

即把应用程序config文件下有关log4net的所有配置项移除放到单一文件Log4Net.config中,这样给应用程序的配置文件“瘦身”不少,呵呵!

ok,编译类库LoggHelper(可在里面封装对log4net的所有操作),将控制台程序改为

  1. static void Main(string[] args)
  2. {
  3. //log4net.Config.XmlConfigurator.Configure(); //注释掉
  4. try
  5. {
  6. LoggHelper.LogInfo();
  7. LoggHelper.LogWarn();
  8. LoggHelper.LogError();
  9. LoggHelper.LogFatal();
  10. Console.ReadLine();
  11. }
  12. catch (Exception ex)
  13. {
  14. Console.Write(ex);
  15. }
  16. }

运行,一切ok!

附有关log4net的对数据库写日志的配置:

http://logging.apache.org/log4net/release/config-examples.html

Log4net 写文件日志与数据库日志的更多相关文章

  1. log4net 写数据到sql数据库

    最近需要把用户的一些行为添加到数据库中,所以想到了用log4net ,如果有别的好的方案,大家可以给我指正. 先看一下配置文件 我这个是控制台文件 app.config <layout type ...

  2. Log4Net的应用教程之保存日志到数据库中

    关于Log4Net的应用,网上有很多教程,但大多数都是拷贝复制,有些按照他的代码来,运行起来发现也出不来效果,但是Log4net的作用实在是非常大的,或者这里说的不对,应该说系统的日志功能是很重要的也 ...

  3. log4net 添加自定义日志到数据库

    添加操作日志到数据库举例: (一)建立数据库的操作日志表,如下我建立了一个简单的日志表 (二)配置文件中的配置如下 <log4net> <!--错误日志记录数据库--> < ...

  4. log4net 将日志写入数据库

    asp.net利用log4net写入日志到SqlServer数据库,Log4net是一个开源的错误日志记录项目,易用性强,源自log4j,品质值得信赖. 下面就我的安装部署log4net到MS sql ...

  5. 使用log4net写自定义日志

    在使用log4net写Web服务器端日志的时候,通常需要一些自定义的参数,比如请求的url,method,以及用户名等等,而log4net中默认的Log接口只提供了很少的参数.    在网上找的其他的 ...

  6. 扔掉log4j、log4j2,自己动手实现一个多功能日志记录框架,包含文件,数据库日志写入,实测5W+/秒日志文件写入,2W+/秒数据库日志写入,虽然它现在还没有logback那么强大

    讲到log4j,现在国外基本是没有开发者用这个框架了,原因大致有几点,1.功能太少:2.效率低下:3.线程锁bug等等等各种莫名其妙的bug一直都没解决. 其实最重要的是log4j的作者自己也放弃了l ...

  7. MS SqlServer 通过数据库日志文件找回已删除的记录

    1.建立演示数据(创建数据库数据表添加基础数据) 1.1 创建数据库 1.2 创建数据表 1.3填充数据 1.4做数据库完整备份 2.模拟误删除.记录操作时间.备份数据库日志 2.1删除数据并记录操作 ...

  8. 怎么在.NetCore3.0 中使用Log4net 写日志 及读取配置文件的信息

    1:安装Log4Net的 NuGet 包: 我们通常之需要安装这一个包即可,其他的主包会自动被添加进来: insatll-package  Microsoft.Extensions.Logging.L ...

  9. SOME:收缩数据库日志文件,查看表数据量和空间占用,查看表结构索引修改时间

    ---收缩数据库日志文件 USE [master]ALTER DATABASE yourdatabasename SET RECOVERY SIMPLE WITH NO_WAITALTER DATAB ...

随机推荐

  1. WPF学习笔记3——Layout之1

    一.概述 了解XAML的基本之后,进入Layout的学习.Layout,即布局,可能需要用到几种不同的容器.每一种容器都有各自的逻辑.在用户界面的设计过程中,很多时候是在想办法使得界面更加吸引.实在. ...

  2. 分享零基础学习Hadoop方法

    (我不是Hadoop专家,也只是一个初学者,这里我也只是就自己的学习体会,站在初学者的角度谈一下如何入门.) 首先我觉得应该思考这样一个问题:Hadoop对于我们来讲,是一种工具,那么Hadoop帮助 ...

  3. 创建Mysql

    CREATE DATABASE IF NOT EXISTS yiya DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

  4. vim emmet配置

    http://nerd-is.in/2013-12/learning-vim-again-1-install-vundle/ http://nerd-is.in/2013-12/learn-vim-a ...

  5. Nhibernate 一对多,多对一配置

    先来分析下问题,这里有两张表:Users(用户表) U和PersonalDynamic(用户动态表) PD,其中PD表的UserId对应U表的Id 如图: 现在映射这两张表: 如图: User.hbm ...

  6. 将 Photoshop CC 2015.5 英文界面换成中文, 英文与中文界面互换

    注:转载或引用请注明出处 在英文的win server 2012 r2 上安装PS CC 2015.5 时,安装程序自动按成了英文版的PS,那么如何将英文换成中文呢? 网上大多讲的都是将中文换成英文, ...

  7. JniHelper 含安卓推送

    using System; using System.Runtime.CompilerServices; using UnityEngine; internal static class JniHel ...

  8. SQL分组查询GroupBy

    一.分组查询1.使用group by进行分组查询在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:〉被分组的列〉为每个分组返回一个值得表达式 ...

  9. 乐1/MACBOOK/ N1 Type-C接口新体验

    经过在华强北电子市场排队一个小时,笔者顺利买到了期待已久的乐1,结合之前的NOKIA平板电脑N1,苹果全新MACBOOK,终于集齐了手机.平板.笔记本电脑三种TYPE-C接口设备(能兑换极品装备吗?^ ...

  10. Android 自定义seekbar中,thumb被覆盖掉一部分问题

    (图一)  (图二)    (图三) 做一个自定义的seekbar,更改其背景图片: <com.android.Progress android:id="@+id/focus_seek ...