C# 使用Log4Net记录日志(进阶篇)

配置文件log4net_config.xml中的内容如下:

<?xml version="1.0" encoding="utf-8" ?>
<!--
		.NET application configuration file
		This file must have the exact same name as your application with .config appended to it. 

		For example if your application is ConsoleApp.exe then the config file must be ConsoleApp.exe.config.
		It must also be in the same directory as the application.
	-->
<!-- This section contains the log4net configuration settings -->
<log4net>
	<!-- Define some output appenders -->
	<appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender">
		<file value="rolling-log.txt" />
		<appendToFile value="true" />
		<maxSizeRollBackups value="10" />
		<maximumFileSize value="100" />
		<rollingStyle value="Size" />
		<staticLogFileName value="true" />
		<layout type="log4net.Layout.PatternLayout">
			<header value="[Header]
" />
			<footer value="[Footer]
" />
			<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
		</layout>
	</appender>
	<appender name="LogFileAppender" type="log4net.Appender.FileAppender">
		<file value="log.txt" />
		<!-- Example using environment variables in params -->
		<!-- <file value="${TMP}\log-file.txt" /> -->
		<sppendToFile value="true" />
		<!-- An alternate output encoding can be specified -->
		<!-- <encoding value="unicodeFFFE" /> -->
		<layout type="log4net.Layout.PatternLayout">
			<header value="[Header]
" />
			<footer value="[Footer]
" />
			<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
		</layout>
		<!-- Alternate layout using XML
			<layout type="log4net.Layout.XMLLayout" /> -->
	</appender>
	<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender">
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date [%thread] %-5level %logger [%ndc] <%property{auth}> - %message%newline" />
		</layout>
	</appender>
	<appender name="NetSendAppender" type="log4net.Appender.NetSendAppender">
		<threshold value="ERROR" />
		<server value="SQUARE" />
		<recipient value="nicko" />
		<layout type="log4net.Layout.PatternLayout">
			<conversionPattern value="%date [%thread] %-5level %logger [%ndc] - %message%newline" />
		</layout>
	</appender>
	<!-- Example of how to configure the AdoNetAppender to connect to MS Access -->
	<appender name="ADONetAppender_Access" type="log4net.Appender.AdoNetAppender">
		<connectionString value="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" />
		<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
		<parameter>
			<parameterName value="@log_date" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%date" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@thread" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%thread" />
			</layout>
		</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="@logger" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%logger" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@message" />
			<dbType value="String" />
			<size value="1024" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%message" />
			</layout>
		</parameter>
	</appender>
	<!-- Example of how to configure the AdoNetAppender to connect to MS SQL Server -->
	<appender name="ADONetAppender_SqlServer" type="log4net.Appender.AdoNetAppender">
		<bufferSize value="1" />
		<connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
		<connectionString value="data source=192.168.110.110;initial catalog=DBtest;integrated security=false;persist security info=True;User ID=sa;Password=saPassword" />
		<commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" />
		<parameter>
			<parameterName value="@log_date" />
			<dbType value="DateTime" />
			<!--
				<layout type="log4net.Layout.PatternLayout">
					<conversionPattern value="%date{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" />
				</layout>
				-->
			<layout type="log4net.Layout.RawTimeStampLayout" />
		</parameter>
		<parameter>
			<parameterName value="@thread" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%thread" />
			</layout>
		</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="@logger" />
			<dbType value="String" />
			<size value="255" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%logger" />
			</layout>
		</parameter>
		<parameter>
			<parameterName value="@message" />
			<dbType value="String" />
			<size value="4000" />
			<layout type="log4net.Layout.PatternLayout">
				<conversionPattern value="%message" />
			</layout>
		</parameter>
	</appender>
	<!-- Setup the root category, add the appenders and set the default level -->
	<root>
		<level value="DEBUG" />
		<appender-ref ref="LogFileAppender" />
		<appender-ref ref="ADONetAppender_SqlServer" />
		<!--<appender-ref ref="ConsoleAppender" />-->
	</root>
</log4net>

该配置文件可以用于往文本文件及sql server数据库中记录日志(启用哪一个由下面的配置决定):

<appender-ref ref="LogFileAppender" />
<appender-ref ref="ADONetAppender_SqlServer" />

日志类封装:

/// <summary>
    /// 日志记录类(记录到数据库)
    /// </summary>
    public static class LogisTracToSqlDB
    {
        private static readonly log4net.ILog m_log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private const string LOG4NET_CONFIG = "log4net_config.xml";

        static LogisTracToSqlDB()
        {
            try
            {
                ConfigureLoad();
            }
            catch { }
        }

        /// <summary>
        /// 输出日志
        /// </summary>
        /// <param name="sInfo"></param>
        public static void WriteLog(string sInfo)
        {
            m_log.Error(sInfo);
        }
        /// <summary>
        /// 记录debug信息
        /// </summary>
        /// <param name="e"></param>
        public static void WriteLog(Exception e)
        {
            WriteLog(e.ToString());
            //WriteLog("--------------------------------------[本次异常开始]--------------------------------------");
            //WriteLog("Message : " + e.Message);
            //WriteLog("Source : " + e.Source);
            //WriteLog("StackTrace : " + e.StackTrace);
            //WriteLog("TargetSite : " + e.TargetSite);
            //WriteLog("--------------------------------------[本次异常结束]--------------------------------------\r\n");
        }

        /// <summary>
        /// 配置log4net环境
        /// </summary>
        private static void ConfigureLoad()
        {
            XmlDocument doc = new XmlDocument();
            //使用当前dll路径
            string sPath = FilesOperate.GetAssemblyPath();
            if (!sPath.EndsWith("\\"))
            {
                sPath += "\\";
            }
            sPath += LOG4NET_CONFIG;
            doc.Load(@sPath);
            XmlElement myElement = doc.DocumentElement;
            log4net.Config.XmlConfigurator.Configure(myElement);
        }
    }
    /// <summary>
    /// 日志记录类(记录到文本文件中)
    /// </summary>
    public static class LogisTrac
    {
        private static readonly string LOG_DIR = "日志";
        private static readonly string LOG_FILE = LOG_DIR + "\\log" + System.DateTime.Now.ToString("yyyy-MM-dd") + ".txt";
        private const string LOG4NET_CONFIG = "log4net_config.xml";
        private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(typeof(LogisTrac));

        static LogisTrac()
        {
            try
            {
                ConfigureLoad();
            }
            catch { }
        }

        /// <summary>
        /// 返回ILog接口
        /// </summary>
        private static log4net.ILog Log
        {
            get
            {
                return m_log;
            }
        }

        /// <summary>
        /// 输出日志
        /// </summary>
        /// <param name="sInfo"></param>
        public static void WriteLog(string sInfo)
        {
            m_log.Error(sInfo);
        }

        /// <summary>
        /// 记录debug信息
        /// </summary>
        /// <param name="e"></param>
        public static void WriteLog(Exception e)
        {
            WriteLog("--------------------------------------[本次异常开始]--------------------------------------");
            WriteLog("Message : " + e.Message);
            WriteLog("Source : " + e.Source);
            WriteLog("StackTrace : " + e.StackTrace);
            WriteLog("TargetSite : " + e.TargetSite);
            WriteLog("--------------------------------------[本次异常结束]--------------------------------------\r\n");
        }

        /// <summary>
        /// 配置log4net环境
        /// </summary>
        private static void ConfigureLoad()
        {
            XmlDocument doc = new XmlDocument();
            //使用当前dll路径
            string sPath = FilesOperate.GetAssemblyPath();

            if (!sPath.EndsWith("\\"))
            {
                sPath += "\\";
            }

            //查看Log文件夹是否存在,如果不存在,则创建
            string sLogDir = sPath + LOG_DIR;
            if (!Directory.Exists(sLogDir))
            {
                Directory.CreateDirectory(sLogDir);
            }
            string sLogFile = sPath + LOG_FILE;
            sPath += LOG4NET_CONFIG;
            doc.Load(@sPath);
            XmlElement myElement = doc.DocumentElement;

            //修改log.txt的路径
            XmlNode pLogFileAppenderNode = myElement.SelectSingleNode("descendant::appender[@name='LogFileAppender']/file");
            // Create an attribute collection from the element.
            XmlAttributeCollection attrColl = pLogFileAppenderNode.Attributes;
            attrColl[0].Value = sLogFile;

            log4net.Config.XmlConfigurator.Configure(myElement);
        }

    }

    /// <summary>
    /// 文件 操作
    /// </summary>
    public static class FilesOperate
    {
        /// <summary>
        /// 获取App的当前路径 \\结束
        /// </summary>
        /// <returns></returns>
        public static string getAppPath()
        {
            return GetAssemblyPath();
        }

        /// <summary>
        /// 获取Assembly的运行路径 \\结束
        /// </summary>
        /// <returns></returns>
        public static string GetAssemblyPath()
        {
            string sCodeBase = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

            sCodeBase = sCodeBase.Substring(8, sCodeBase.Length - 8);    // 8是 file:// 的长度

            string[] arrSection = sCodeBase.Split(new char[] { '/' });

            string sDirPath = "";
            for (int i = 0; i < arrSection.Length - 1; i++)
            {
                sDirPath += arrSection[i] + Path.DirectorySeparatorChar;
            }

            return sDirPath;
        }

        /// <summary>
        /// 文件夹复制
        /// </summary>
        /// <param name="sSourceDirName">原始路径</param>
        /// <param name="sDestDirName">目标路径</param>
        /// <returns></returns>
        public static bool CopyDirectory(string sSourceDirName, string sDestDirName)
        {
            if (string.IsNullOrEmpty(sSourceDirName) || string.IsNullOrEmpty(sDestDirName))
            {
                return false;
            }

            //不复制.svn文件夹
            if (sSourceDirName.EndsWith("svn"))
            {
                return true;
            }

            if (sSourceDirName.Substring(sSourceDirName.Length - 1) != Path.DirectorySeparatorChar.ToString())
            {
                sSourceDirName = sSourceDirName + Path.DirectorySeparatorChar;
            }
            if (sDestDirName.Substring(sDestDirName.Length - 1) != Path.DirectorySeparatorChar.ToString())
            {
                sDestDirName = sDestDirName + Path.DirectorySeparatorChar;
            }

            #region 复制函数
            if (Directory.Exists(sSourceDirName))
            {
                if (!Directory.Exists(sDestDirName))
                {
                    Directory.CreateDirectory(sDestDirName);
                }
                foreach (string item in Directory.GetFiles(sSourceDirName))
                {
                    File.Copy(item, sDestDirName + System.IO.Path.GetFileName(item), true);
                }
                foreach (string item in Directory.GetDirectories(sSourceDirName))
                {
                    CopyDirectory(item, sDestDirName + item.Substring(item.LastIndexOf(Path.DirectorySeparatorChar) + 1));
                }
            }
            return true;
            #endregion
        }

        /// <summary>
        /// 启动其他的应用程序
        /// </summary>
        /// <param name="file">应用程序名称</param>
        /// <param name="workdirectory">应用程序工作目录</param>
        /// <param name="args">命令行参数</param>
        /// <param name="style">窗口风格</param>
        public static bool StartProcess(string file, string workdirectory, string args, ProcessWindowStyle style)
        {
            try
            {
                Process pMyProcess = new Process();
                ProcessStartInfo pStartInfo = new ProcessStartInfo(file, args);
                pStartInfo.WindowStyle = style;
                pStartInfo.WorkingDirectory = workdirectory;
                pMyProcess.StartInfo = pStartInfo;
                pMyProcess.StartInfo.UseShellExecute = false;
                pMyProcess.Start();
                return true;
            }
            catch (Exception ex)
            {
                //LogAPI.debug(ex);
                return false;
            }
        }

        /// <summary>
        /// 获得本地计算机名
        /// </summary>
        /// <returns></returns>
        public static string GetComputerName()
        {
            return Dns.GetHostName();
        }

        /// <summary>
        /// 获得计算机IP地址
        /// </summary>
        /// <returns></returns>
        public static string GetIPAddress()
        {
            try
            {
                string sComputerName;
                sComputerName = GetComputerName();
                string sIpAddress = "";
                IPAddress[] addr = Dns.GetHostAddresses(sComputerName);
                //for (int i = 0; i < addr.Length; i++)
                //{
                //    sIpAddress += addr[i].ToString() + " ";
                //}
                sIpAddress = addr[0].ToString();
                return sIpAddress;
            }
            catch (Exception ep)
            {
                //LogAPI.debug(ep);
                return "127.0.0.1";
            }
        }

        /// <summary>
        /// 描述:创建目录
        /// </summary>
        /// <returns></returns>
        public static bool CreateFolder(string sFolder)
        {
            //如果临时文件夹不存在,则创建该文件夹
            if (!Directory.Exists(sFolder))
            {
                Directory.CreateDirectory(sFolder);
            }
            return true;
        }
    }

log4net 基础篇:点击打开链接
源码下载地址:点击打开链接 

时间: 2024-08-04 06:14:04

C# 使用Log4Net记录日志(进阶篇)的相关文章

C# 使用Log4Net记录日志(基础篇)

最近在"伯乐在线"上看到这么篇文章<用Log4Net来记录系统的日志信息>,由于没有用到过Log4Net这个东东,就有了下面这篇文章:         第一步:下载Log4Net        下载地址:http://logging.apache.org/log4net/download_log4net.cgi            把下载的  log4net-1.2.13-bin-newkey解压后,如下图所示:  双击bin文件夹,如下图: 双击net文件夹,选择针对.

标准SEO优化型网站建设之进阶篇

继上一篇<标准SEO优化型网站建设的准备工作>之后,本文为进阶篇,也是标准SEO优化型网站建设的核心篇,我们切入正题. 一.网站模块 1.SEO优化型网站的导航栏.导航栏在整个网页篇幅中是最重要的,搜索引擎给予导航栏的内容很高的"权重",所以建议优化型网站的导航栏中适当的加入关键词链接(例如在导航的"产品展示"做一个下拉菜单列出含有关键词的产品链接). 2.网站首页板块.关于网站首页模块布置各有各的风格与重点展示,但SEO优化型网站请务必坚持三点: 1)

WPF 4 DataGrid 控件(进阶篇二)

上一篇<WPF 4 DataGrid 控件(进阶篇一)>中我们通过DataGridTemplateColumn 类自定义编辑了日期列的样式,当然也可以根据个 人需要设置任何样式模板.上例中Pass Exam 列显示学生是否通过考试,但我们并不知道该学生每门学科的成绩是多少.本篇将为 DataGrid 行增加这些详细信息,使得DataGrid 数据更加充实. 首先,我们仍然先更新一下Member 类,增加Math 和History 两门学科: public class Member { publ

Emit学习-进阶篇-定义事件

之前在研究如何用Emit为动态类添加事件,本来以为会非常简单,但是却碰到 了许多的问题,有些问题在之前的答疑篇中已经提到了,并予以了解决,虽然有 些地方自己也不是很明白,但毕竟还是解决了,最后比较我写的IL代码,和系统 自动生成的,总有一些地方无法做到一致.特别是在为事件添加add和remove方法 时,碰到了许多问题,下面我将针对这些问题进行讲解.按照惯例,先给出要实 现的类的C#代码,方便反编译后对照着进行IL代码的书写,代码如下: Publisher public class Publis

Java中jqGrid 学习笔记整理——进阶篇(二)_java

相关阅读: Java中jqGrid 学习笔记整理--进阶篇(一) 本篇开始正式与后台(java语言)进行数据交互,使用的平台为 JDK:java 1.8.0_71 myEclisp 2015 Stable 2.0 Apache Tomcat-8.0.30 Mysql 5.7 Navicat for mysql 11.2.5(mysql数据库管理工具) 一.数据库部分 1.创建数据库 使用Navicat for mysql创建数据库(使用其他工具或直接使用命令行暂不介绍) 2. 2.创建表 双击打

phalapi-进阶篇8(PhalApi能带来什么和进阶篇总结)

phalapi-进阶篇8(PhalApi能带来什么和进阶篇总结) 前言 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 到今天位置PhalApi已经开源一周年了,他从一个不起眼的小框架,到现在一个在不断迎合业务需求不断成长,也能为大家带来便捷的框架,从当初的群里只有几个人到现在群里已经有300+位童鞋,从没有项目使用到实际项目28+,这一切都要感谢开源精神以及那么多 小伙伴的支持,在本次进阶篇的尾声我们来一同聊一聊PhalApi能带来什么以及对进阶篇进

《 C++程序设计:原理与实践(进阶篇.》导读

本节书摘来自华章出版社< C++程序设计:原理与实践(进阶篇)>一书中作者[美] 本贾尼·斯特劳斯特鲁普(Bjarne Stroustrup) 著 刘晓光 李忠伟 王刚 译     前 言 Programming: Principles and Practice Using C++, Second Edition 该死的鱼雷!全速前进. --Admiral Farragut 程序设计是这样一门艺术,它将问题求解方案描述成计算机可以执行的形式.程序设计中很多工作都花费在寻找求解方案以及对其求精上

PowerShell攻防进阶篇:nishang工具用法详解

本文讲的是PowerShell攻防进阶篇:nishang工具用法详解, 1.简介 Nishang是一款针对PowerShell的渗透工具.说到渗透工具,那自然便是老外开发的东西.国人开发的东西,也不是不行,只不过不被认可罢了.不管是谁开发的,既然跟渗透有关系,那自然是对我们有帮助的,学习就好.来源什么的都不重要.总之,nishang也是一款不可多得的好工具.非常的好用. 2.简单的安装与问题处理   先到github上去下载nishang,可以使用git命令直接下载,如果没有装的话下载zip文件

ES6 你可能不知道的事 - 进阶篇

前言 这篇文章主要会针对上篇未涉及到的进阶特性展开:而与前一篇文章相同,本文主要介绍这些特性的一些容易忽略的部分,希望能对大家正确认识和使用 ES6 有帮助. 还是那句话,时间和能力有限,针对文章中的问题或不同意见,欢迎随时拍砖.指正! 正文 Module 模块化是个进行了很久的话题,发展历程中出现过很多模式,例如 AMD, CommonJS 等等. Module 是 ES6 的新特性,是语言层面对模块化的支持. 与之前模块加载机制不同,Module 是动态的加载,导入的是变量的 只读引用 ,而