log4net 代码配置 sqlite

我有一个winform项目, 需要使用日志功能, 并且不希望用户看到我的日志内容和配置文件. 所以选择了用代码配置log4net.

网上的log4net例子很多都是使用配置文件, 使用代码配置的不多. 另外数据库我使用的是sqlite, access的sql太难用了.

首先下载log4net.dll并添加到项目. 下载地址:http://logging.apache.org/log4net/

一般使用log4net需要在项目的AssemblyInfo.cs下面添加[assembly: log4net.Config.XmlConfigurator(Watch = true)].

但是代码配置不用加这句, 而是在Program.cs的Main()方法里面加初始化操作.

 

log4net的配置代码如下:

using log4net.Appender;
using log4net.Config;
using log4net.Layout;

namespace MyLog
{
    public class LogHelper
    {

        public static readonly log4net.ILog logProxy = log4net.LogManager.GetLogger("logProxy");
        //记录异常日志数据库连接字符串
        private const string _ConnectionString = " Data Source = Global/log4net.db3";

        /// <summary>
        /// 使用SQLite记录异常日志
        /// </summary>
        public static void SetADONetAppender()
        {
            log4net.Repository.Hierarchy.Hierarchy hier = log4net.LogManager.GetRepository() as log4net.Repository.Hierarchy.Hierarchy;

            if (hier != null)
            {
                log4net.Appender.AdoNetAppender adoAppender = new log4net.Appender.AdoNetAppender();
                adoAppender.Name = "AdoNetAppender";
                adoAppender.CommandType = System.Data.CommandType.Text;
                adoAppender.BufferSize = 1;
                adoAppender.ConnectionType = "System.Data.SQLite.SQLiteConnection, System.Data.SQLite, Version=1.0.94.0, Culture=neutral";
                adoAppender.ConnectionString = _ConnectionString;
                adoAppender.CommandText = @"INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Source],[Message],[Exception]) VALUES" +
                                                     " (@log_date, @thread, @log_level, @logger,@source, @message, @exception)";
                adoAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@log_date", DbType = System.Data.DbType.DateTime, Layout = new log4net.Layout.RawTimeStampLayout() });
                adoAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@thread", DbType = System.Data.DbType.String, Size = 255, Layout = new Layout2RawLayoutAdapter(new PatternLayout("%thread")) });
                adoAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@log_level", DbType = System.Data.DbType.String, Size = 50, Layout = new Layout2RawLayoutAdapter(new PatternLayout("%level")) });
                adoAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@logger", DbType = System.Data.DbType.String, Size = 255, Layout = new Layout2RawLayoutAdapter(new PatternLayout("%logger")) });
                adoAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@source", DbType = System.Data.DbType.String, Size = 255, Layout = new Layout2RawLayoutAdapter(new PatternLayout("%file:%line")) });
                adoAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@message", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(new PatternLayout("%message")) });
                adoAppender.AddParameter(new AdoNetAppenderParameter { ParameterName = "@exception", DbType = System.Data.DbType.String, Size = 4000, Layout = new Layout2RawLayoutAdapter(new ExceptionLayout()) });
                adoAppender.ActivateOptions();
                BasicConfigurator.Configure(adoAppender);
            }
        }
    }
}

下面是Program.cs的代码: (红色为我添加的代码)

using System;
using System.Windows.Forms;

namespace MyLog
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            LogHelper.SetADONetAppender();//程序启动时候初始化log4net

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
    }
}

 

代码配置好了, 还要为项目添加System.Data.SQLite.dll .  然后建立数据库. 用sqlite的管理工具生成一个log4net.db3, 使用以下代码生成表:

CREATE TABLE Log ( 
    LogId     INTEGER         PRIMARY KEY,
    Date      DATETIME        NOT NULL,
    Thread    VARCHAR( 50 )   NOT NULL,
    Level     VARCHAR( 50 )   NOT NULL,
    Logger    VARCHAR( 255 )  NOT NULL,
    Source    VARCHAR( 255 )  NOT NULL,
    Message   TEXT            DEFAULT 'NULL',
    Exception TEXT            DEFAULT 'NULL'
);

 

程序调用写日志的代码:

LogHelper.logProxy.Debug("登录方法Login出错了.");

 

一切就绪, 运行程序, 执行调用代码, 然后查看文件: Debug/Global/log4net.db3 看是否写入了日志数据.

 

至于sqlite如何设置密码, 这个有待解决.

 

posted @ 2014-11-07 16:28  Kulle  Views(1190)  Comments(0)    收藏  举报