首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

棘手有关问题,关于日志记录有关问题

2012-03-16 
求助棘手问题,关于日志记录问题写的一个日志记录代码,发现一个很严重的问题,同一种情况下报出异常后在xp下

求助棘手问题,关于日志记录问题
写的一个日志记录代码,发现一个很严重的问题,同一种情况下报出异常后在xp下就会生成日志文件并且记录相关日志,但在win7环境下就什么都没有,请问怎么回事??求解决 
附上代码

C# code
/* * 异步日志类 *  *  * */using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Diagnostics;using System.Data.SqlClient;using System.IO;namespace Lib.Common.Common{    public sealed class AsynLogManager    {        #region Member Variables        /// <summary>        /// 用于Trace的组织输出的类别名称        /// </summary>        private const string trace_sql = "\r\n***********************TRACE_SQL {0}*****************************\r\nTRACE_SQL";        /// <summary>        /// 用于Trace的组织输出的类别名称        /// </summary>        private const string trace_exception = "\r\n***********************TRACE_EXCEPTION {0}***********************";        /// <summary>        /// 当前日志的日期        /// </summary>        private static DateTime CurrentLogFileDate = DateTime.Now;        /// <summary>        /// 日志对象        /// </summary>        private static TextWriterTraceListener  twtl=new TextWriterTraceListener();        /// <summary>        /// 日志根目录        /// </summary>        private static string log_root_directory =AppDomain.CurrentDomain.BaseDirectory; //@"D:\log";        /// <summary>        /// 日志子目录        /// </summary>        private static string log_subdir;        /// <summary>        /// "      {0} = {1}"        /// </summary>        private const string FORMAT_TRACE_PARAM = "      {0} = {1}";        /// <summary>        /// 1   仅控制台输出        /// 2   仅日志输出        /// 3   控制台+日志输出        /// </summary>        private static readonly int flag = 2;         //可以修改成从配置文件读取        #endregion        #region Constructor        static AsynLogManager()        {            System.Diagnostics.Trace.AutoFlush = true;            switch (flag)            {                case 1:                    System.Diagnostics.Trace.Listeners.Add(new ConsoleTraceListener());                    break;                case 2:                    System.Diagnostics.Trace.Listeners.Add(TWTL);                    break;                case 3:                    System.Diagnostics.Trace.Listeners.Add(new ConsoleTraceListener());                    System.Diagnostics.Trace.Listeners.Add(TWTL);                    break;            }        }        #endregion        #region Method        #region trace        /// <summary>        /// 异步错误日志        /// </summary>        /// <param name="value"></param>        public static void Trace(Exception ex)        {            new AsyncLogException(BeginTraceError).BeginInvoke(ex, null, null);        }        /// <summary>        /// 异步SQL日志        /// </summary>        /// <param name="cmd"></param>        public static void Trace(SqlCommand cmd)        {            new AsyncLogSqlCommand(BeginTraceSqlCommand).BeginInvoke(cmd, null, null);        }        /// <summary>        /// 异步SQL日志        /// </summary>        /// <param name="sql"></param>        /// <param name="parameter"></param>        public static void Trace(string sql, params SqlParameter[] parameter)        {            new AsyncLogSql(BeginTraceSql).BeginInvoke(sql, parameter, null, null);        }        #endregion        #region delegate        private delegate void AsyncLogException(Exception ex);        private delegate void AsyncLogSqlCommand(SqlCommand cmd);        private delegate void AsyncLogSql(string sql, params SqlParameter[] parameter);        private static void BeginTraceError(Exception ex)        {            if (null != ex)            {                //检测日志日期                StrategyLog();                //输出日志头                System.Diagnostics.Trace.WriteLine(string.Format(trace_exception, DateTime.Now));                while (null != ex)                {                    System.Diagnostics.Trace.WriteLine(string.Format("{0} {1}\r\n{2}\r\nSource:{3}", ex.GetType().Name, ex.Message, ex.StackTrace, ex.Source));                    ex = ex.InnerException;                }            }        }        private static void BeginTraceSqlCommand(SqlCommand cmd)        {            if (null != cmd)            {                SqlParameter[] parameter = new SqlParameter[cmd.Parameters.Count];                cmd.Parameters.CopyTo(parameter, 0);                BeginTraceSql(cmd.CommandText, parameter);            }        }        private static void BeginTraceSql(string sql, params SqlParameter[] parameter)        {            if (!string.IsNullOrEmpty(sql))            {                //检测日志日期                StrategyLog();                System.Diagnostics.Trace.WriteLine(sql, string.Format(trace_sql, DateTime.Now));                if (parameter != null)                {                    foreach (SqlParameter param in parameter)                    {                        System.Diagnostics.Trace.WriteLine(string.Format(FORMAT_TRACE_PARAM, param.ParameterName, param.Value));                    }                }            }        }        #endregion        #region helper        /// <summary>        /// 根据日志策略生成日志        /// </summary>        private static void StrategyLog()        {            //判断日志日期            if (DateTime.Compare(DateTime.Now.Date, CurrentLogFileDate.Date) != 0)            {                DateTime currentDate = DateTime.Now.Date;                //生成子目录                BuiderDir(currentDate);                //更新当前日志日期                CurrentLogFileDate = currentDate;                System.Diagnostics.Trace.Flush();                //更改输出                if (twtl != null)                    System.Diagnostics.Trace.Listeners.Remove(twtl);                System.Diagnostics.Trace.Listeners.Add(TWTL);                         }        }        /// <summary>        /// 根据年月生成子目录        /// </summary>        /// <param name="currentDate"></param>        private static void BuiderDir(DateTime currentDate)        {            int year = currentDate.Year;            int month = currentDate.Month;            //年/月            string subdir = string.Concat(year, '\\', month);            string path = Path.Combine(log_root_directory, subdir);            if (!Directory.Exists(path))            {                Directory.CreateDirectory(path);            }            log_subdir = subdir;        }        #endregion        #endregion        #region Properties        /// <summary>        /// 日志文件路径        /// </summary>        /// <returns></returns>        private static string GetLogFullPath        {            get            {                return string.Concat(log_root_directory,"\\" ,string.Concat(log_subdir, @"\log", CurrentLogFileDate.ToShortDateString(), ".txt"));            }        }        /// <summary>        /// 跟踪输出日志文件        /// </summary>        private static TextWriterTraceListener TWTL        {            get            {                if(twtl==null||twtl.Writer==null)                {                    if (string.IsNullOrEmpty(log_subdir))                        BuiderDir(DateTime.Now);                    else                    {                        string logPath = GetLogFullPath;                        if (!Directory.Exists(Path.GetDirectoryName(logPath)))                            BuiderDir(DateTime.Now);                    }                    twtl = new TextWriterTraceListener(File.Create(GetLogFullPath));                                    }                return twtl;            }        }        #endregion    }} 



[解决办法]
win7下权限问题 不是什么地方都可以操作的 把日志文件生成到别的盘符看看
[解决办法]
在win7下是否能生成 日志文件?
[解决办法]
win7下需要管理员权限才可以在系统盘写入文件,你要给你的程序获取管理员权限,如果你用的是vs2005的.net2.0的项目,需要自己配制程序运行前,请求获取管理员权限,可以Settings.settings里配制,也可以在项目的生成的时候用批处理
[解决办法]
我觉得是权限问题,话说有问题会报错呀...

热点排行