当前位置:编程学习 > C#/ASP.NET >>

C#日志


using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

using System.Configuration;

namespace Com.Jwz.Log
{
    /// <summary>
    /// 类名:Com.Jwz.Log.FileLog
    /// 描述:
    /// 
    /// 作者:Jiangwzh
    /// 创建时间:2007-12-31
    /// 最后修改时间:2007-12-31
    /// </summary>
    public class FileLog
    {
       public static string FilePath=string.Empty;//存放日志的路径
        public static long FileMaxSize=1024000;//日志文件的最大长度
        public static string FileName=string.Empty;//日志文件名
        public static bool EnabledConsole = true;//是否向控制台输出日志
        public static bool EnabledDebug = true;//是否充许Debug信息输出
        public static bool EnabledInfo = true;//是否充许Info信息输出
        public static bool EnabledWarning = true;//是否充许Warning信息输出
        public static bool EnableError = true;//是否充许Error信息输出

        public enum LogLevel //日记级别
        {
            DEBUG = 0,
            INFO = 1,
            WARNING = 2,
            ERROR = 3
        }

        private string m_Local = string.Empty;//信息所在的位置

        public string Local
        {
            get { return m_Local; }
            set { m_Local = value; }
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="local"></param>
        public FileLog(string local)
        {
            this.Local = local;
        }
        /// <summary>
        /// 将日志级别转化为相应的字符串
        /// </summary>
        /// <param name="logType"></param>
        /// <returns></returns>
        public static string GetLogLevelString(LogLevel logLevel)
        {
            string ret = "信息";
            switch (logLevel)
            {
                case LogLevel.DEBUG:
                    ret= "调试";
                    break;
                case LogLevel.INFO:
                    ret= "信息";
                    break;
                case LogLevel.WARNING:
                    ret= "警告";
                    break;
                case LogLevel.ERROR:
                    ret= "错误";
                    break;
                default:
                    break;
            }
            return ret;
        }

 
        /// <summary>
        /// 将文本写入日志文件
        /// </summary>
        /// <param name="txt"></param>
        private static void WriteTextToFile(string txt)
        {
            if (FileLog.FileName == string.Empty)
                FileLog.FileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".log";

            StreamWriter sw = null;
            FileInfo finfo = new FileInfo(FileLog.FilePath + "\\" + FileLog.FileName);
            if (!finfo.Exists)
            {
                sw = File.CreateText(FileLog.FilePath + "\\" + FileLog.FileName);
            }
            else
            {
                if (finfo.Length >= FileLog.FileMaxSize)
                {
                    FileName = DateTime.Now.ToString("yyyyMMddHHmmss") + ".log";
                    sw = File.CreateText(FileLog.FilePath + "\\" + FileLog.FileName);
                }
                else
                    sw = new StreamWriter(finfo.OpenWrite());
               
            }

            sw.BaseStream.Seek(0, SeekOrigin.End);
         
            sw.Write(txt);
            sw.Flush();
            sw.Close();
        }

        /// <summary>
        /// 通过配置文件对FileLog进行初始化
        /// </summary>
        /// <param name="logConfigFile"></param>
        public static void InitFileLog(string logConfigFile)
        {
            FileLog.FilePath = ReadLogConfig(logConfigFile, "FilePath");
            if (ReadLogConfig(logConfigFile, "FileMaxSize")!=string.Empty)
                FileLog.FileMaxSize = Convert.ToInt64(ReadLogConfig(logConfigFile, "FileMaxSize"));

            if (ReadLogConfig(logConfigFile, "EnabledConsole") != string.Empty)
                FileLog.EnabledConsole = Convert.ToBoolean(ReadLogConfig(logConfigFile, "EnabledConsole"));

            if (ReadLogConfig(logConfigFile, "EnabledDebug") != string.Empty)
                FileLog.EnabledDebug = Convert.ToBoolean(ReadLogConfig(logConfigFile, "EnabledDebug"));

            if (ReadLogConfig(logConfigFile, "EnabledInfo") != string.Empty)
                FileLog.EnabledInfo = Convert.ToBoolean(ReadLogConfig(logConfigFile, "EnabledInfo"));

            if (ReadLogConfig(logConfigFile, "EnabledWarning") != string.Empty)
                FileLog.EnabledWarning = Convert.ToBoolean(ReadLogConfig(logConfigFile, "EnabledWarning"));

            if (ReadLogConfig(logConfigFile, "EnableError") != string.Empty)
                FileLog.EnableError = Convert.ToBoolean(ReadLogConfig(logConfigFile, "EnableError"));

            if (FileLog.FilePath == string.Empty)
                FileLog.FilePath = System.Windows.Forms.Application.StartupPath;

        }

        /// <summary>
        /// 读取配置文件
        /// </summary>
        /// <param name="logConfigFile"></param>
        /// <param name="key"></param>
        /// <returns></returns>
        private static string ReadLogConfig(string logConfigFile, string key)
        {
            if (File.Exists(logConfigFile))
            {
                ExeConfigurationFileMap file = new ExeConfigurationFileMap();
                file.ExeConfigFilename = logConfigFile;
                Configuration config = ConfigurationManager.OpenMappedExeConfiguration(file, ConfigurationUserLevel.None);
                if (config.AppSettings.Settings[key] != null)
                    return config.AppSettings.Settings[key].Value;
                else
                    return string.Empty;
            }
            else
                return string.Empty;
        }


    }
}

--------------------编程问答--------------------

       /// <summary>
        /// 判断相应的级别是否充许输出
        /// </summary>
        /// <param name="logLevel"></param>
        /// <returns></returns>
        private static bool LogLevelEnabled(LogLevel logLevel)
        {

            bool ret = false;
            switch (logLevel)
            {
                case LogLevel.DEBUG:
                    ret = EnabledDebug;
                    break;
                case LogLevel.INFO:
                    ret = EnabledInfo;
                    break;
                case LogLevel.WARNING:
                    ret = EnabledWarning;
                    break;
                case LogLevel.ERROR:
                    ret = EnableError;
                    break;
                default:
                    ret = false;
                    break;
            }
            return ret;
        }
        
        /// <summary>
        /// 写日记 实例方法
        /// </summary>
        /// <param name="logLevel"></param>
        /// <param name="msg"></param>
        public void Log(LogLevel logLevel, string msg)
        {
            FileLog.WriteLog(logLevel,string.Empty,msg);
        }

        public void Log(LogLevel logLevel, string local,string msg)
        {
            if (local == string.Empty)
                local = this.Local;
            FileLog.WriteLog(logLevel, this.Local, msg);
        }

        public void Debug(string msg)
        {
            Log(LogLevel.DEBUG,msg);
        }

        public void Debug(string local,string msg)
        {
            Log(LogLevel.DEBUG,local, msg);
        }

        public void Info(string msg)
        {
            Log(LogLevel.INFO, msg);
        }

        public void Info(string local, string msg)
        {
            Log(LogLevel.INFO,local, msg);
        }

        public void Warning(string msg)
        {
            Log(LogLevel.WARNING, msg);
        }

        public void Warning(string local,string msg)
        {
            Log(LogLevel.WARNING,local, msg);
        }

        public void Error(string msg)
        {
            Log(LogLevel.ERROR, msg);
        }

        public void Error(string local,string msg)
        {
            Log(LogLevel.ERROR, local,msg);
        }


        /// <summary>
        /// 写日记 静态方法
        /// </summary>
        /// <param name="logLevel"></param>
        /// <param name="local"></param>
        /// <param name="msg"></param>
        public static void WriteLog(LogLevel logLevel, string local, string msg)
        {
            if (!LogLevelEnabled(logLevel)) return;

            StringBuilder sb = new StringBuilder();
            sb.Append(GetLogLevelString(logLevel) + "\t" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\t" + local);
            sb.Append("\n");
            sb.Append(msg);
            sb.Append("\n\n");

            if (EnabledConsole)
            {
                Console.Write(sb.ToString());
            }
                
            WriteTextToFile(sb.ToString());

        }

        public static void WriteDebug(string local, string msg)
        {
            WriteLog(LogLevel.DEBUG, local, msg);
        }

        public static void WriteInfo(string local, string msg)
        {
            WriteLog(LogLevel.INFO, local, msg);
        }

        public static void WriteWarning(string local, string msg)
        {
            WriteLog(LogLevel.WARNING, local, msg);
        }

        public static void WriteError(string local, string msg)
        {
            WriteLog(LogLevel.ERROR, local, msg);
        }

--------------------编程问答-------------------- 使用方法:
       1、用配置文件初始化FileLog.InitFileLog(filename).当然也可以不初始化直接使用,此时采用默认设置,文件所在的目录为应用程序所在的目录。
       2、写日志可以调用静态方法,也可以调用实例方法。视方便而定。
       3、对于Window应用程序,建议设置项目的输出类型为控制台应用程序,这些日记输出时自动打开一个控制台窗口。 --------------------编程问答-------------------- 增加了一个消息队列,每次写日记时只将日志写入消息队列,再由后台线程写入日志文件,提高效率 --------------------编程问答-------------------- 楼主研究一下 log4net
绝对的好用~ --------------------编程问答-------------------- WPF版CLog日志记录控件源代码及使用
CLog可以让你在现有日志记录的系统中增加在服务器上记录客户端消息功能,它适用于任何WCF或ASP.NET Web服务用户。CLog是一个完全的日志提供系统,它有非常好的可定制性,线程级安全,能够序列化所有异常Exception类型,并可以在客户端或服务器端定制任何过滤机制:IP范围过滤,成员角色过滤,环境用户名过滤、机器名过滤时间范围过滤等…… 文章提供详细的使用教程和升级方法,并提供各种实例源代码。 


也值得研究 --------------------编程问答-------------------- 这只是自己写的一个简单的日记类,在自己的项目中使用,定制起来比较方便 --------------------编程问答-------------------- 谢谢楼主~ --------------------编程问答-------------------- 需求不一样,使用的日志也就不一样。
顶,楼主! --------------------编程问答-------------------- 楼主很强 --------------------编程问答-------------------- 飘过。再回来拿分! --------------------编程问答-------------------- 恩恩,还是习惯用自己的。
接分~ --------------------编程问答-------------------- 路过,自己也写了一个,不过是C++的类 --------------------编程问答-------------------- jf ,不错 --------------------编程问答-------------------- jf
--------------------编程问答-------------------- 楼主很强 学习 了啊 --------------------编程问答-------------------- 我也在写日志,顶一个 --------------------编程问答-------------------- 好文章 --------------------编程问答-------------------- 好东西
收藏了。。。。 --------------------编程问答-------------------- mark --------------------编程问答-------------------- mark --------------------编程问答-------------------- 感谢楼主分享,收藏下.有时间研究一下.不过一直在用4楼说的Log4Net. --------------------编程问答-------------------- up
引用 4 楼 superwat 的回复:
楼主研究一下 log4net 
绝对的好用~
--------------------编程问答-------------------- 学习。。。。。。 --------------------编程问答-------------------- 顶 --------------------编程问答-------------------- 学习中... --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- DAY DAY UP! --------------------编程问答-------------------- jf --------------------编程问答-------------------- mark,赞一个!!! --------------------编程问答-------------------- 接分来了 --------------------编程问答-------------------- 正在用,差不多 --------------------编程问答-------------------- 好类啊,呵呵,受教了。 --------------------编程问答--------------------
引用 18 楼 happychou 的回复:
好东西
收藏了。。。。
收藏了。。。。 --------------------编程问答-------------------- 路过。。。看看。。。。 --------------------编程问答-------------------- 顶,回复内容太短了! 
--------------------编程问答-------------------- 学习了... TKS......... --------------------编程问答-------------------- TKS 多谢LZ   dd --------------------编程问答-------------------- 楼主实用么?给我一个撒。邮箱:xuyong825909822@126.com
--------------------编程问答-------------------- 呵呵,好,值得学习

  交流下啊  --------------------编程问答--------------------
引用 4 楼 superwat 的回复:
楼主研究一下 log4net
 绝对的好用~

en 是啊 log4net已经做的相当完善了 --------------------编程问答-------------------- 纯粹为了接分,哦也
回复内容太短了 --------------------编程问答-------------------- 不错,很好............................................... --------------------编程问答-------------------- 可以学习学习。
log4net已经做的相当完善了 --------------------编程问答-------------------- 不错,记下以后看。。。。。。。。。。。 --------------------编程问答-------------------- UP 
LZ AND LOG4NET
--------------------编程问答-------------------- 正在學些日志類呢。做個參考。 --------------------编程问答-------------------- 顶贴吗?哈 --------------------编程问答-------------------- 谢谢LZ分享 --------------------编程问答-------------------- 学习了 谢谢 --------------------编程问答-------------------- 感觉没有考虑并发的问题。 --------------------编程问答-------------------- public static string GetLogLevelString(LogLevel logLevel)
        {
            string ret = "信息";
            switch (logLevel)
            {
                case LogLevel.DEBUG:
                    ret= "调试";
                    break;
                case LogLevel.INFO:
                    ret= "信息";
                    break;
                case LogLevel.WARNING:
                    ret= "警告";
                    break;
                case LogLevel.ERROR:
                    ret= "错误";
                    break;
                default:
                    break;
            }
            return ret;
        }

这个你可以弄一个Dictionary<LogLevel, string>
或者直接在enum枚举项上加[Description("调试")]
然后弄一个方法GetCustomAttribute<AttributeT>(LogLevel level)取各得描述


--------------------编程问答-------------------- 52svo --------------------编程问答-------------------- 我是建立一个window窗体应用程序项目,把这段代码放在cs中显示找不到类型或命名空间名称“ExeConfigurationFileMap”(是否缺少 using 指令或程序集引用?)是不是缺少配置啊,请问配置文件具体这么写?我刚接触C#,请高手指点 --------------------编程问答-------------------- 我是建立一个window窗体应用程序项目,把这段代码放在cs中显示找不到类型或命名空间名称“ExeConfigurationFileMap”(是否缺少 using 指令或程序集引用?)是不是缺少配置啊,请问配置文件具体这么写?我刚接触C#,请高手指点 --------------------编程问答-------------------- 正在 写前准备中,谢谢楼主分享资料 --------------------编程问答-------------------- study
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,