2012-07-26 31 views
10

Estoy trabajando en una aplicación que se ejecutará en OSX y Windows. Quiero que los registros se escriban en el directorio de inicio de los usuarios. Para OSX, estará en el directorio/Users // Library/Application Support/MyApp/log, y debajo de Windows, dependiendo de la versión en/Users // AppData/MyApp/log directory.log4j archivo de registro en el directorio de inicio del usuario

¿Cuál es la mejor manera que puedo hacer esto? He buscado soluciones para esto, pero nada útil o una solución que me resulte cómoda ha surgido.

Esperamos sus entradas.

edición: Desde la ubicación del archivo de registro depende del sistema operativo, yo soy la esperanza de encontrar una solución en tiempo de ejecución, posiblemente, algo así como debajo de

if (System.getProperty("os.name").contains("mac")) 
    logFileLocation = System.getProperty("user.home") + "/Library/Application Support/MyApp/logs" 
else 
    logFileLocation = System.getenv("APPDATA") + "/MyApp/logs" 

Gracias

Respuesta

16

Cambiar el ConsoleAppender a una FileAppender. Por lo que sé, la solicitud de escritura se redirigirá a appdata en el sistema operativo Windows. No estoy seguro acerca de las MacOs.

URL mySource = MyAppMainClass.class.getProtectionDomain().getCodeSource().getLocation(); 
File rootFolder = new File(mySource.getPath()); 
System.setProperty("app.root", rootFolder.getAbsolutePath()); 

y editar log4j configuración como esta

log4j.appender.NotConsole=org.apache.log4j.RollingFileAppender 
log4j.appender.NotConsole.fileName=${app.root}/fileName.log 

o para usuario doméstico:

log4j.appender.NotConsole.fileName=${user.home}/fileName.log 
+0

tenga en cuenta que debe asegurarse de tener la autorización adecuada en las carpetas. – Tomer

+0

La carpeta $ {user.home} generalmente está abierta para operaciones de escritura. El propósito de esa carpeta es almacenar los archivos específicos del usuario creados en la sesión. –

+0

Gracias por la respuesta; sin embargo, en esta solución, la ubicación del archivo de registro será la misma, independientemente del sistema operativo. Consulte mi edición anterior para obtener más aclaraciones sobre el problema. – Poorav

0

Posiblemente el método más limpio sería escribir la configuración de log4j asumiendo una propiedad particular del sistema (por ejemplo myapp.data.dir)

log4j.appender.logfile.fileName=${myapp.data.dir}/logs/myapp.log 

y establecer esa propiedad de la manera adecuada en el iniciador para cada plataforma. Por ejemplo, si usted está usando un paquete de .app en Mac OS X entonces se puede establecer propiedades del sistema en Info.plist

<plist version="1.0"> 
<dict> 
    <!-- ... --> 
    <key>Java</key> 
    <dict> 
     <!-- ... --> 
     <key>Properties</key> 
     <dict> 
      <key>apple.laf.useScreenMenuBar</key> 
      <string>true</string> 
      <key>myapp.data.dir</key> 
      <string>$USER_HOME/Library/Application Support/MyApp</string> 

o ponerlo en relación con la variable de entorno APPDATA en Windows (que se ocuparía de la diferencia entre XP y 7) Con un Launch4J.exe puede poner -Dmyapp.data.dir="%APPDATA%\MyApp" en el .l4j.ini file.

Se necesitaría código explícito para inicializar log4j antes de intentar acceder a cualquier madereros

if(System.getProperty("myapp.data.dir") == null) { 
    // fallback to ~/.myapp (sensible Linux default) if run without a launcher 
    System.setProperty("myapp.data.dir", new File(
     System.getProperty("user.home"), ".myapp").getAbsolutePath()); 
} 
// ensure log directory exists 
new File(new File(System.getProperty("myapp.data.dir")), "logs").mkdirs(); 
// now it's safe to configure log4j 
PropertyConfigurator.configure(this.getClass().getResource("/log4j.properties")); 
1

gracias a todos por las entradas. en base a la insinuación de que Alex propuso Fui con el siguiente enfoque,

En log4j.properties que tenía la siguiente configuración

log4j.appender.FILE=org.apache.log4j.RollingFileAppender 
log4j.appender.FILE.File=${userApp.root}/logs/myapp.log 

y en el inicio de la aplicación que he hecho esto.

System.setProperty("userApp.root", getUserAppDirectory()); 

el método getUserAppDirectory() se define como

static String getUserAppDirectory() { 
    if (isMacOS()) 
     return System.getProperty("user.home") + "/Library/Application Support/myapp"; 
    else 
     return System.getenv("APPDATA") + "/myapp"; 
} 
0

He resuelto problema de ruta de log4j.xml en Mac:

en las ventanas que configurar log4j en web.xml como:

<listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>file:${LOG4J_HOME}/conf/log4j.xml</param-value> 

<!-- Above path is that where we have stored log4j.xml file externally --> 
    </context-param> 

    <context-param> 
     <param-name>log4jRefreshInterval</param-name> 
     <param-value>6000</param-value> 
    </context-param> 

donde $ {} LOG4J_HOME es varible de usuario se utiliza para fijar en la ventana. como

variable de usuario = LOG4J_HOME valor = D:/LOG4J (en la unidad d hemos creado una carpeta de nombre Log4J copiamos ese camino y ha puesto como un valor)

En Mac que han envirenvirent fasility conjunto de variables por comando bash, pero ya no funciona.

así que para mac tenemos que crear una carpeta en cualquier lugar y tenemos que dar la ruta estática de esa carpeta.

como en xml:

<listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>file:/Users/vardhaman/Desktop/LOG4J/conf/log4j.xml</param-value> 
<!-- Above path is that where we have stored log4j.xml file externally to get this path go up to the log4j.xml file in external device and right click select get info, where we will get path, copy that path --> 

    </context-param> 

    <context-param> 
     <param-name>log4jRefreshInterval</param-name> 
     <param-value>6000</param-value> 
    </context-param> 

La misma manera que tenemos que hacer en el archivo log4j.xml

En la ventana que usamos para hacer como:

<appender name="CLICK-SPRING" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="${LOG4J_HOME}/logs/CLICK/CLICK-spring.log"/> 
     <param name="Append" value="true"/> 
     <param name="Threshold" value="DEBUG"/> 
     <param name="MaxFileSize" value="100MB"/> 
     <param name="MaxBackupIndex" value="10" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p [%t] %C{1}.%M(%L) | %m%n"/> 
     </layout> 
    </appender> 

En Mac:

en lugar de valor, tenemos que copiar la ruta estática hasta la carpeta LOG4J, o puede crear cualquier carpeta.

<appender name="CLICK-SPRING" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="Users/vardhaman/Desktop/LOG4J/logs/CLICK/CLICK-spring.log"/> 
     <param name="Append" value="true"/> 
     <param name="Threshold" value="DEBUG"/> 
     <param name="MaxFileSize" value="100MB"/> 
     <param name="MaxBackupIndex" value="10" /> 
     <layout class="org.apache.log4j.PatternLayout"> 
      <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} %p [%t] %C{1}.%M(%L) | %m%n"/> 
     </layout> 
    </appender> 
Cuestiones relacionadas