La respuesta de Peter casi trabajó para mí; Definitivamente me puso en el camino correcto porque necesitaba una solución similar.Lo que tenía que hacer era subclase PatternConverter
:
public class ConfigurationSettingsConverter : PatternConverter
{
protected override void Convert(TextWriter writer, object state)
{
// use Option as a key to get a configuration value...
if (Option != null)
writer.Write(ConfigUtils.Setting[Option]);
}
}
y añadir este convertidor en el ActivateOptions
anulación de una subclase de PatternString
:
public class ConfigurationSettingsPatternString : PatternString
{
public ConfigurationSettingsPatternString()
{}
public ConfigurationSettingsPatternString(string pattern): base(pattern)
{}
public override void ActivateOptions()
{
AddConverter("cs", typeof(ConfigurationSettingsConverter));
base.ActivateOptions();
}
}
originalmente tratado de hacer esto en el constructor como respondió Pedro pero el convertidor no se devolvió desde la llamada subyacente de la cadena de patrones para analizar la cadena de origen. También tuve que registrar un convertidor de tipos (que no debe confundirse con un PatternConverter
) en cualquier parte de la ruta de código antes de log4net se configuró:
ConverterRegistry.AddConverter(
// type we want to convert to (from string)...
typeof(ConfigurationSettingsPatternString),
// the type of the type converter that will do the conversion...
typeof(ConfigurationSettingsPatternStringConverter));
No hacer esto evita log4net de ser capaz de convertir el valor atributo en FileAppender
'nodo (es decir, una cadena) en un ConfigurationSettingsPatternString
. Por ejemplo, en este fragmento de configuración,
<file
type="Some.Name.Space.ConfigurationSettingsPatternString, Some.Assembly"
value="some\path\MyLog.%cs{SomeKey}.log" />
%cs.{SomeKey}
no llegaría expandido, y log4net produce una excepción. Aquí está el código para el convertidor de tipos:
public class ConfigurationSettingsPatternStringConverter : IConvertTo, IConvertFrom
{
public bool CanConvertFrom(Type sourceType)
{
return sourceType == typeof(string);
}
public bool CanConvertTo(Type targetType)
{
return typeof(string).IsAssignableFrom(targetType);
}
public object ConvertFrom(object source)
{
var pattern = source as string;
if (pattern == null)
throw ConversionNotSupportedException.Create(typeof(ConfigurationSettingsPatternString), source);
return new ConfigurationSettingsPatternString(pattern);
}
public object ConvertTo(object source, Type targetType)
{
var pattern = source as PatternString;
if (pattern == null || !CanConvertTo(targetType))
throw ConversionNotSupportedException.Create(targetType, source);
return pattern.Format();
}
}
Esto resulta para funcionar bien para múltiples servicios de Windows alojados dentro del mismo ejecutable (por ejemplo, es posible añadir un serviceName patrón % como el nombre del archivo para separar el registros de servicios de los
Puede obtenerlo a través de un patrón de apéndice en Log4Net versión 1.2.11. Ver stackoverflow.com/a/26277219/203371 –