Devem-se tomar algumas precaucoes ao configurar o log4j emaplicacoes que rodam em um cluster de servidores de aplicacao.A principal delas e separar os arquivos de log por servidor. Por que? Quando se tem em uma mesma maquina mais de um servidor, ouseja, mais de uma JVM havera concorrencia de escrita no arquivo. Basta suaaplicacao receber algumas requisicoes simultaneasem servidores distintos para os sintomas abaixo serem notados: Mensagens com horarios desordenados Mensagens corrompidas Mensagens sobrepostas Mensagens perdidasEvitar esses problemas e simples.Solucao 1 - Parametrizacao manualAdicionar um parametro de JVM (VM argument) em cada servidorque o identifique.-DserverName=server1No log4j modificar o nome/caminho do arquivo para utilizar oparametro definido no servidor.<appender name="appender1" class="org.apache.log4j.DailyRollingFileAppender"><param name="File" value="/logs/webapp1/application-${serverName}.log"/>ou<appender name="appender1"class="org.apache.log4j.DailyRollingFileAppender"><param name="File" value="/logs/webapp1/${serverName}/application.log"/>Solucao 2 - Parametrizacao automaticaEm clusters com muitos servidores a parametrizacao manual torna-se dificil manter. Automatizar esse processo nao e complicado.O exemplo abaixo foi desenvolvido para WebSphere, porem, pode ser utilizado como base tanto para ser generico quanto para outros servidores especificos. Primeiro, cria-se um ServletContextListener que verifica a existencia do parametro de JVM e caso nao exista ele e adicionado. Esse listener deve ser executado primeiro pela aplicacao.package br.com.billcode.listener; import java.lang.reflect.Method;import javax.servlet.ServletContextEvent;import javax.servlet.ServletContextListener;public class ServerNameListener implements ServletContextListener { private static final String SERVER_NAME_KEY = "SERVER_NAME_KEY"; public void contextDestroyed(ServletContextEvent event) { // Do nothing } public void contextInitialized(ServletContextEvent event) { String serverNameArgument = event.getServletContext().getInitParameter(SERVER_NAME_KEY); if (serverNameArgument == null){ return; } String serverName = System.getProperty(serverNameArgument); // Verifies if the parameter already exists if(serverName != null){ return; } serverName = generateServerName(); if(serverName == null){ return; } System.setProperty(serverNameArgument, serverName); } /** * @return The WebSphere Server's display name. */ private String generateServerName() { String serverName = null; try { Class<?> serverNameClass = Class.forName("com.ibm.websphere.runtime.ServerName"); Method method = serverNameClass.getMethod("getDisplayName", null); serverName = (String) method.invoke(null, null); } catch (Exception e) { throw new RuntimeException(e); } return serverName; }}Segundo, adiciona-se o listener ao web.xml.<listener> <listener-class>br.com.billcode.listener.ServerNameListener</listener-class</listener> Terceiro, para o parametro de JVM nao ficar fixo na aplicacao adiciona-se um ContextParam.<context-param> <param-name>SERVER_NAME_KEY</param-name> <param-value>serverName</param-value></context-param>Quarto, no log4j modificar o nome/caminho do arquivo para utilizar oparametro definido como ContextParam no web.xml.<appender name="appender1" class="org.apache.log4j.DailyRollingFileAppender"><param name="File" value="/logs/webapp1/application-${serverName}.log"/>ou<appender name="appender1"class="org.apache.log4j.DailyRollingFileAppender"><param name="File" value="/logs/webapp1/${serverName}/application.log"/> 1 - Adicionar configuracoes de coresE possivel exibir os resultados coloridos dos comandos do Git, para isto: - Adicionar o conteudo abaixo no arquivo de configuracoes do git: ~/.gitconfig[user] name = Roger Camargo email = email@...[color] diff = auto status = auto branch = auto interactive = auto ui = auto[color "branch"] current = green bold local = green remote = red bold[color "status"] added = green bold changed = yellow bold untracked = red[alias] st = status ci = commit df = diff co = checkout br = branch lg = log --pretty=oneline --graph --date=short --decorate Resultado:2 - Exibir o branch corrente no shellAo trabalhar com branch, e muito importante saber em qual branch esta no momento, afim de evitar commits em um branch indesejado. - Adicionar o conteudo abaixo apos a definicao da variavel PS1 no arquivo ~/.bashrc# git branchPS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ 'Ou uma segunda opcao para mostrar a branch em uma cor diferente# git branchPS1='\[\033[01;32m\]\w\[\033[01;34m\]$(__git_ps1 " (%s)")\n\[\033[00m\]\u@\h\$ ' Resultado: 3 - Instalando ferramenta visual para historico de alteracoes Por