Log4j файл журнала в домашней директории пользователя

Я работаю над приложением, которое будет работать в OSX и Windows. Я хочу, чтобы журналы записывались в домашний каталог пользователей. Для OSX он будет находиться в каталоге /Users//Library/Application Support/MyApp/log и под окнами в зависимости от версии в каталоге /Users//AppData/MyApp/log.

Как я могу это сделать? Я искал решения для этого, но ничего полезного или решение, которое мне удобно использовать, появилось.

Посмотрите вперед к своим входам.

изменить: Поскольку местоположение файла журнала зависит от ОС, я надеюсь найти решение времени выполнения, возможно, что-то вроде ниже

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

Спасибо

Ответ 1

Измените ConsoleAppender на FileAppender. Насколько я знаю, запрос на запись будет перенаправлен на appdata на ОС Windows. Не уверен относительно MacOs.

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

и отредактируйте конфигурацию log4j следующим образом

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

или для пользователя:

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

Ответ 2

Спасибо всем за вклад. основанный на намеке, что Алекс предложил, чтобы я пошел со следующим подходом,

В log4j.properties у меня была следующая конфигурация

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

и в начале приложения я это сделал.

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

Метод getUserAppDirectory() определяется как

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

Ответ 3

Возможно, самым чистым подходом было бы написать вашу конфигурацию log4j, предполагающую конкретное системное свойство (скажем myapp.data.dir)

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

и установите это свойство соответствующим образом в панели запуска для каждой платформы. Например, если вы используете пакет .app в Mac OS X, вы можете установить системные свойства в 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>

или установите его относительно переменной среды APPDATA в Windows (которая будет обрабатывать разницу между XP и 7). С Launch4J .exe вы можете поместить -Dmyapp.data.dir="%APPDATA%\MyApp" в .l4j.ini файл.

Вам нужен явный код для инициализации log4j, прежде чем вы попытаетесь получить доступ к любым регистраторам

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 safe to configure log4j
PropertyConfigurator.configure(this.getClass().getResource("/log4j.properties"));

Ответ 4

У меня есть проблема с исправлением пути log4j.xml в mac:

в Windows мы настраиваем log4j в web.xml, например:

    <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>

Где ${LOG4J_HOME} - пользовательский вариант, который мы используем для установки в окне. как

переменная пользователя = LOG4J_HOME value = D:/LOG4J (в d-диске мы создали папку с именем Log4J, мы скопировали этот путь и дали в качестве значения)

В mac у нас есть envirenvirent переменная set fasility с помощью команды bash, но она больше не работает.

поэтому для mac мы должны создать одну папку где угодно, и мы должны указать статический путь этой папки.

как в 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>

То же самое мы должны сделать в файле log4j.xml

В окне мы используем следующее:

<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> 

В mac:

вместо значения нам нужно скопировать статический путь до папки LOG4J, или вы можете создать любую папку.

<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>