写的一个日志记录代码,发现一个很严重的问题,同一种情况下报出异常后在xp下就会生成日志文件并且记录相关日志,但在win7环境下就什么都没有,请问怎么回事??求解决 
附上代码/*
 * 异步日志类
 * 
 * 
 * */
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    }
}

解决方案 »

  1.   

    不够简化么?嗯 那么简单的说就是我这代码做异常时记录生成日志文件,在xp下没有任何问题,但在win7下无日志文件生成。
      

  2.   

    win7下权限问题  不是什么地方都可以操作的  把日志文件生成到别的盘符看看
      

  3.   

    win7 下appdata文件夹下 应该可以写入
      

  4.   

    所以请教各位看下,我调了发现TextWriterTraceListener TWTL 这个对象twtl中的writer一直为null 但在xp下该属性会记录捕捉到的异常信息
      

  5.   

    在win7下是否能生成 日志文件?
      

  6.   

    生成不了,没有这个txt文本不知道为什么
      

  7.   

    win7下需要管理员权限才可以在系统盘写入文件,你要给你的程序获取管理员权限,如果你用的是vs2005的.net2.0的项目,需要自己配制程序运行前,请求获取管理员权限,可以Settings.settings里配制,也可以在项目的生成的时候用批处理
      

  8.   

    我是放在D盘的,我查看过代码 发现问题出现在这段代码, private static DateTime CurrentLogFileDate = DateTime.Now 生成的日志文件的名称是/,而文件名称不容许出现这个符合,所以导致后面的io异常发生。我现在不知道怎么处理
      

  9.   

    终于改好了,原因很简单 就是在日志类文件中的Datetime类型造成的,原因是在XP下datetime对象输出的格式是yyyy-MM-dd 而到了win7下格式就默认为yyyy/MM/dd了,生成的txt文件名是不能包含/等符号,所以会导致IO异常,从而导致trace错误无法生成日志文件