.net - studio - log4net structured logging
¿Cómo trabajo alrededor de log4net y sigo cambiando publickeytoken? (6)
Tenemos un proyecto asp.net 4.0 que usa un par de frameworks que dependen de log4net versión 1.2.10.0. Hoy traté de incluir un nuevo framework que depende de la versión 1.2.11.0 de log4net. He estado atrapado desde entonces:
log4net 1.2.10.0 tiene publickeytoken = 1b44e1d426115821
log4net 1.2.11.0 tiene publickeytoken = 669e0ddf0bb1aa2a
Dado que estos son diferentes, no puedo usar las redirecciones de ensamblaje (para hacer que todos los marcos usen la misma versión de log4net) o la base de código (para tener solo la nueva versión de uso de marco 1.2.11.0) a través del elemento de tiempo de ejecución en web.config.
¿Cuáles son mis opciones aquí?
(y por qué el bleep log4net sigue cambiando las claves publickey entre versiones, como entiendo que una clave perdida fue la razón para el cambio entre la versión 1.2.9.0 y 1.2.10.0, ¿perdieron la clave una vez más? Voy a ofrecer voluntariamente mi dropbox para mantenerlo a salvo si lo necesitan ...)
Edit: Ok, parece que los chicos de log4net aparentemente tenían la idea de que liberar con dos claves era una buena idea, pero eso significa que cada marco que utilices necesita acordar cuál de los dos sabores prefiere, o esos marcos no pueden funcionar. al lado en el mismo appdomain. ¿Soy el único que considera que esta es una idea horrible? si todos hicieran esto, todo se rompería, ¿verdad?
Edit2: Como dije, no estoy usando log4net en mi código comercial, pero utilizo varios frameworks que dependen de 1.2.10.0, y el problema surgió cuando traté de usar un nuevo framework que dependía de 1.2.11.0 (nueva clave) ), por lo que la respuesta de Stefans no se aplica, porque el nuevo marco esperará la nueva clave, no la anterior.
Así es como conseguí que las cosas funcionen con la versión 1.2.11.0.
- Curse apache para cambiar la llave en primer lugar :)
- Download la versión de 1.2.11.0 firmada con la clave anterior.
- Organice su propio código eliminando cualquier referencia directa a log4net (nueva clave) y reemplace con una referencia al ensamblado firmado con la clave anterior.
- Clasifique los ensamblajes dependientes que pueda tener al incluir este segmento en su web / app.config
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.2.10.0"
newVersion="1.2.11.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
Esto no necesariamente funcionará en todos los casos, pero debido a que el proyecto que estaba usando log4net era OSS, descargué la fuente, reemplacé la versión conflictiva de log4net con la versión que estaba usando y reconstruí el proyecto. En mi caso, era Topshelf, así que ahora tengo una versión del ensamblaje de Topshelf que se construyó con la misma versión de log4net que estoy usando y ahora puedo hacer referencia a ambos sin ningún problema.
Estoy usando la última versión de log4net que descargué a través de nuget. Sin embargo, una de las bibliotecas que estoy usando requiere la versión anterior. Mis problemas me llevaron a esta pregunta.
El problema con las otras respuestas es que están usando la misma versión dll para todas las vinculaciones. Quiero usar funciones en la nueva versión para todo lo demás excepto la dependencia heredada.
Para poder hacer eso, necesitas hacer lo siguiente:
- Comience por Download la versión anterior (versión de 1.2.11.0).
- Cambie el nombre del
log4net.1.2.10.dll
binario descargado alog4net.1.2.10.dll
. Inclúyalo en su proyecto de inicio con la acción Crear establecida enNone
y "Copiar si es más reciente" - Dile a .NET dónde puede encontrar la versión anterior:
App.config
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="log4net" publicKeyToken="1b44e1d426115821" />
<codeBase version="1.2.10.0" href="log4net.1.2.10.dll" />
</dependentAssembly>
</assemblyBinding>
</runtime>
Los atributos href
identifican dónde está la versión anterior. Por lo tanto, todas las demás solicitudes de log4net apuntarán a la nueva versión.
No sé si es adecuado para su caso particular o no, pero puede recompilar uno de los marcos, por lo que usarán log4net con la misma clave pública. En mi caso, fue FluentNHibernate el que usa log4net 1.2.10 y Combres con log4net 1.2.11 con una nueva clave. Descargué log4net 1.2.11 firmado con la clave anterior y recompuse Combress con él. Después de eso, se agregó la redirección de enlace de ensamblaje de 1.2.10 a 1.2.11 y comienza a funcionar.
Puede descargar una versión de log4net 1.2.11.0 que está firmada con la clave anterior. La razón por la cual el cambio a una nueva clave se explica en sus preguntas frecuentes:
http://logging.apache.org/log4net/release/faq.html#two-snks
(Básicamente, la nueva clave está a disposición del público y, por alguna razón, no quisieron incluir la clave anterior en la distribución. No tengo claro por qué no solo hicieron pública la antigua clave)
Traté de ir a los enlaces proporcionados anteriormente, pero parece que todos los enlaces en el sitio Apache no están funcionando. Entonces esto es lo que hice para resolver el problema:
Desde su Visual Studio, use Nuget para descargar e instalar la última versión de log4net (1.2.13.0). El administrador de paquetes NuGet automáticamente descargará y actualizará todo el log4net (1.2.11.0) a la última versión.