Tengo el inicio de sesión de la base de datos utilizando AdoNetAppender. Lo que me gustaría hacer es registrar la identidad del usuario en cada declaración de registro. Sin embargo, no quiero utilizar el parámetro de identidad log4net% estándar por dos razones:registro de base de datos de log4net con parámetros personalizados
- log4net advierten que es extremadamente lento ya que tiene que buscar la identidad del contexto.
- En algunos componentes del servicio, la identidad estándar es una cuenta de servicio, pero ya hemos capturado la identidad del usuario en una variable y me gustaría utilizarla.
He visto un código donde algunas personas usan el log4net.ThreadContext para agregar propiedades adicionales, pero entiendo que esto es 'inseguro' debido al entrelazado de hilos (y también es un drenaje de rendimiento).
Mi enfoque ha sido extender la clase AdoNetAppenderParameter así:
public class UserAdoNetAppenderParameter : AdoNetAppenderParameter
{
public UserAdoNetAppenderParameter()
{
DbType = DbType.String;
PatternLayout layout = new PatternLayout();
Layout2RawLayoutAdapter converter = new Layout2RawLayoutAdapter(layout);
Layout = converter;
ParameterName = "@username";
Size = 255;
}
public override void Prepare(IDbCommand command)
{
command.Parameters.Add(this);
}
public override void FormatValue(IDbCommand command, LoggingEvent loggingEvent)
{
string[] data = loggingEvent.RenderedMessage.Split('~');
string username = data[0];
command.Parameters["@username"] = username;
}
}
y luego agregar mediante programación esto a la appender actual de este modo:
ILog myLog = LogManager.GetLogger("ConnectionService");
IAppender[] appenders = myLog.Logger.Repository.GetAppenders();
AdoNetAppender appender = (AdoNetAppender)appenders[0];
appender.AddParameter(new UserAdoNetAppenderParameter());
myLog.InfoFormat("{0}~{1}~{2}~{3}", userName, "ClassName", "Class Method", "Message");
La intención aquí es utilizar un formato estándar para mensajes y analizar la primera parte de la cadena, que siempre debe ser el nombre de usuario. El método FormatValue() del parámetro de apéndice personalizado debe usar solo esa parte de la cadena para que pueda escribirse en un campo separado en la base de datos de registro.
Mi problema es que no se escriben las instrucciones de registro en la base de datos. Curiosamente, cuando se depura, un punto de interrupción en el método FormatValue() solo se activa cuando detengo el servicio.
He navegado a través de un montón de cosas relacionadas con esto, pero todavía no he encontrado ninguna respuesta. ¿Alguien ha logrado hacer esto o estoy en el camino equivocado? P.S. También intenté extender AdoNetAppender, pero no le da acceso a establecer los valores de los parámetros.
Estoy algo atrapado con log4net y tengo Window s componentes de servicio en la solución que no tienen acceso a HttpContext, aunque pasamos el nombre de usuario como una cadena. Realmente no quiero establecer la propiedad ThreadContext, registrarme y luego desarmarlo cada vez que necesito registrar algo. Esperaba que el AdoNetAppenderParameter extendido se ocuparía de ello. Gracias por tu sugerencia. –