ServiceConfiguration.cscfg中的自定义/嵌套XML设置

时间:2010-11-03 00:49:28

标签: .net logging azure enterprise-library

我们正在尝试将一些动态可配置的日志记录实施到我们的Azure应用程序中,并且我们正在使用企业库来实现这一点,但是为了实现这一点而需要的xml比简单的“appSetting”样式设置更复杂ServiceConfiguration.cscfg文件似乎接受它需要嵌套的xml节点,

e.g。

<configSections>
    <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
</configSections>

解决了(请原谅这个窗口中的格式):

<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
    <listeners>
        <add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            type="OurSolution.Common.AzureDiagnosticTraceListener, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
            name="AzureDiagnosticTraceListener" />
    </listeners>
    <formatters>
        <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
            template="Timestamp: {timestamp}{newline}&#xA;Message: {message}{newline}&#xA;Category: {category}{newline}&#xA;Priority: {priority}{newline}&#xA;EventId: {eventid}{newline}&#xA;Severity: {severity}{newline}&#xA;Title:{title}{newline}&#xA;Machine: {localMachine}{newline}&#xA;App Domain: {localAppDomain}{newline}&#xA;ProcessId: {localProcessId}{newline}&#xA;Process Name: {localProcessName}{newline}&#xA;Thread Name: {threadName}{newline}&#xA;Win32 ThreadId:{win32ThreadId}{newline}&#xA;Extended Properties: {dictionary({key} - {value}{newline})}"
            name="Text Formatter" />
    </formatters>
    <categorySources>
        <add switchValue="All" name="General">
            <listeners>
                <add name="AzureDiagnosticTraceListener" />
            </listeners>
        </add>
    </categorySources>
</loggingConfiguration>

我看不到愚弄ServiceDefinition或ServiceConfiguration文件来接受这个的方法,尽管我可以看到一种方法告诉企业库使用我可以在app.config中执行的ServiceConfiguration文件。 / p>

为什么我们试图解决这个问题是为了允许我们动态调整日志记录的设置,即从No logging更改为Verbose而不必进行重新部署,这在我们的实时应用程序中证明是耗时且不切实际的只是最近才上线所以可能仍然存在奇怪的错误;​​ - )

任何想法都会非常感激 问候 Kindo Malay

2 个答案:

答案 0 :(得分:1)

目前,ServiceConfiguration文件仅限于基本<Setting name="foo" value="bar" />结构。

但值只是一个字符串值。当我需要更具表现力的东西时,我所做的就是将XML作为字符串放在设置的值中,然后在我读出它时将其反序列化为XML。这会使配置文件在您直接编辑时看起来非常难看,因为它会对您设置中的所有XML进行编码,但它确实有效。

如果我们只是查看你的听众部分,以保持示例小:

<listeners>
    <add listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    type="OurSolution.Common.AzureDiagnosticTraceListener, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"
    name="AzureDiagnosticTraceListener" />
</listeners>

这可以放在ServiceConfiguration文件中,如下所示:

<Setting name="Logging" value="&lt;listeners&gt;&lt;add listenerDataType=&quot;Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.CustomTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging, Version=5.0.414.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35&quot; type=&quot;OurSolution.Common.AzureDiagnosticTraceListener, Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null&quot; name=&quot;AzureDiagnosticTraceListener&quot; /&gt;&lt;/listeners&gt;" />

最简单的方法是获取源XML,替换所有选项卡和回车,并通过云项目属性设置部分更新设置。

一旦部署它就改变它并非完全直截了当,但可行。

答案 1 :(得分:1)

其他选择:

  • 任意配置的Base64编码,并将它们放入cscfg
  • 的值
  • (我最喜欢的)只需在blob存储或数据库中保留额外的配置(使管理部署的生活更简单)