2012-07-20 51 views
3

有一个asp.net,dot net 4 web应用程序,使用log4net进行日志记录。我们登录到Windows事件日志和Oracle 11g表。除Application_Start外,我们可以在任何地方登录到Oracle表。真的很烦人的事情?它默默地失败。打开控制台日志记录,然后重定向到一个文件,最后一个条目在我们开始记录之前是“添加了一个名为[AdoNetAppender]的记录器[root]。”此时,Repository.Configured(对于log4net-default-repository)对于所有记录器都是正确的。逆转配置文件中appender apear的顺序不起作用。log4net AdoNetAppender不能在Application_Start中工作()

配置文件的log4net的部分:

<log4net debug="true"> <!-- log4net.Internal.Debug set to true in appSettings, System.Diagnostics.Trace is output to file.> 
    <appender name="EventLogAppender" type="log4net.Appender.EventLogAppender"> 
     <param name="LogName" value="AppLog" /> 
     <param name="ApplicationName" value="AppName" /> 
     <!-- Only log warnings and errors. Levels are ALL, DEBUG, INFO, WARN, ERROR, FATAL, OFF --> 
     <threshold value="INFO" /> 
     <layout type="log4net.Layout.PatternLayout"> 
      <conversionPattern value="%utcdate{MM/dd/yyyy HH:mm:ss} [%property{log4net:HostName}] %-5level WEBUI[%logger] [%u] %message%newline" /> 
     </layout> 
    </appender> 

    <appender name="AdoNetAppender" type="Logging.CustomAdoNetAppender, Logging"> <!-- So it can find the custom appender-->   
     <ConnectionStringName value="Database"/> 
     <connectionType value="System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />    
     <bufferSize value="1"/><!--This is the number of log entries, not the size in bytes... "1" sets to no buffering --> 
     <commandText value="audit_tracking.Add_log" /> 
     <commandType value="StoredProcedure" />    
     <parameter> 
      <parameterName value="I_Thread" />     
      <dbType value="AnsiString" /> <!--AnsiString is VarChar. "String" will assume NVarChar --> 
      <size value="255" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%thread"></conversionPattern> 
      </layout> 
     </parameter> 

     <parameter> 
      <parameterName value="I_Log_Level" /> 
      <dbType value="AnsiString" /> 
      <size value="225" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%level"/> 
      </layout> 
     </parameter> 

     <parameter> 
      <parameterName value="I_Logger" /> 
      <dbType value="AnsiString" /> 
      <size value="225" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%logger"/> 
      </layout> 
     </parameter> 

     <parameter> 
      <parameterName value="I_Message" /> 
      <dbType value="AnsiString" /> 
      <size value="4000" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%message"/> 
      </layout> 
     </parameter> 

     <parameter> 
      <parameterName value="I_Exception_Str" /> 
      <dbType value="AnsiString" /> 
      <size value="4000" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%exception"/> 
      </layout> 
     </parameter> 

     <parameter> 
      <parameterName value="I_Server_Name" /> 
      <dbType value="AnsiString" /> 
      <size value="255" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%property{log4net:HostName}"/> 
      </layout> 
     </parameter> 

     <parameter> 
      <parameterName value="I_User_Name" /> 
      <dbType value="AnsiString" /> 
      <size value="255" /> 
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%property{UserName}"/> 
      </layout> 
     </parameter> 

     <parameter> 
      <parameterName value="I_User_Id" /> 
      <dbType value="Int64" />     
      <layout type="log4net.Layout.PatternLayout"> 
       <conversionPattern value="%property{UserId}"/> 
      </layout> 
     </parameter> 
    </appender> 

    <root> 
     <level value="DEBUG" /> 
     <appender-ref ref="EventLogAppender" />    
     <appender-ref ref="AdoNetAppender" /> 
    </root> 
</log4net> 

C#的部分:

protected void Application_Start(object sender, EventArgs e) 
    { 


    read_init_data();//reads some init data from the db and caches it <-- this works, btw. 

     //log4net.Config.XmlConfigurator.Configure();//not needed since we config in AssemblyInfo.cs 
     log4net.GlobalContext.Properties["UserName"] = "";//HttpContext.Current.User.Identity.Name does not exist yet 
     log4net.GlobalContext.Properties["UserId"] = "0";//so we can't get a user id, either... 
     log4net.ILog logger = log4net.LogManager.GetLogger("Global"); 

     logger.Info("Application Start");//logs to event log but not to db...   

    } 

    protected void Session_Start(object sender, EventArgs e) 
    { 

    ulong UserId=GetUserId(HttpContext.Current.User.Identity.Name);//db call to get user id. 

     //log4net.Config.XmlConfigurator.Configure();//not needed since we config in AssemblyInfo.cs 
     log4net.GlobalContext.Properties["UserName"] = HttpContext.Current.User.Identity.Name; 
     log4net.GlobalContext.Properties["UserId"] = UserId; 
     log4net.ILog logger = log4net.LogManager.GetLogger("Global"); 

     logger.Info("Session_Start");//logs to event log and db  

} 

public class CustomAdoNetAppender : AdoNetAppender 
    { 
     public string ConnectionStringName 
     { 
      set { ConnectionString = ConfigurationManager.ConnectionStrings[value].ToString(); } 
     } 
    } 

任何想法?

+0

确实read_init_data做了任何日志? – 2012-07-23 07:43:52

+0

编号原来是两件事。一个是log4net无法找到appender,另一个是db的触发器,我确信不在那里,但是那里有。所以当第一个问题得到解决时,数据库问题仍然存在。 – wiredog 2012-07-23 16:53:45

回答

0

尝试开启Visual Studio中所有异常的中断,以查看log4net中是否存在引发并吞下的异常,但可能会告诉您原因。

由于数据库用户的登录错误,它在过去没有记录到数据库时对我有所帮助。

+0

做到了。没有例外抛出。 – wiredog 2012-07-20 11:52:42

0

当你问一个dba是否有任何约束条件或触发器可能在你喂入一个空字符串时触发,并且他们向你保证没有,并且似乎没有其他合理的解释,请再次问他们,当站立时在他们的立方体。让他们展示给你。

刚收到一封电子邮件,通知我说,他们向我保证的限制条件不存在呢,其实,存在......

为什么不抛出任何异常我还是不知道。

+1

我并不感到惊讶,log4net没有给你一个例外(请参阅本页上的“log4net是一个可靠的日志记录系统?”:http://logging.apache.org/log4net/release/faq.html。你可以尝试这个http://logging.apache.org/log4net/release/sdk/log4net.Util.LogLog.InternalDebugging.html看看发生了什么... – TheNextman 2012-07-20 15:57:06

+0

那么,甲骨文应该抱怨...并且有一个异常(好,错误信息)抱怨说,它找不到appender,直到我在配置文件中将appender名称添加到程序名中。 真的,两个问题,db问题和程序集名称问题。第二个问题解决了实际的记录器问题,但数据库问题掩盖了...... – wiredog 2012-07-21 02:19:32