Durante a operação do projeto, geralmente é necessário executar depuração funcional e rastrear e gravar o comportamento do usuário. Algumas pessoas estão acostumadas a usar o System.out, mas isso não é recomendado. É fácil de usar, mas não é fácil de manter e não tem escalabilidade. Comparado com o LOG4J, o LOG4J pode controlar o destino, o formato de saída e o nível de informações do log etc., para que possamos controlar o processo de geração de log com mais cuidado.
O Log4J2 é uma atualização para o LOG4J1, com melhorias significativas no desempenho e na funcionalidade, incluindo a taxa de transferência aprimorada em multithreads, suporte para espaço reservado, recarga automática de arquivos de configuração, etc.
1. Introdução
1. Faça o download do pacote JAR
POX.XML
<Dependences> <pendency> <voundId> org.apache.logging.log4j </groupId> <TRAFACTID> log4j-api </artifactId> <versão> 2.10.0 </version> </dependency> <spendency> <vroupId> org.apache.logging.Log4J </GrupoId> Artif> Artif> <ristif> <roupid> <Versão> 2.10.0 </versão> </dependency> </dependências>
2. Arquivo de configuração
O LOG4J contém quatro implementações de fábrica de configuração: JSON, YAML, Propriedades e XML. Este artigo apresenta o método comumente usado XML.
O Log4J tem a capacidade de se configurar automaticamente durante a inicialização. Quando o Log4J iniciar, ele localizará todos os arquivos compatíveis com nomes no ClassPath, com ordem prioritária: log4j2-test.properties> log4j2-test.xml> log4j2.properties> log4j2.xml
3. Um exemplo simples
Configuração XML:
<? xml versão = "1.0" coding = "utf-8"?> <status da configuração = "warn"> <pêndores> <console name = "console" target = "system_out"> <padringLayout Pattern = " %d {hh: mm: sss} [ %t] %--5levell» <Groggers> <root nível = "info"> <appenderref ref = "console"/> </root> </loggers> </figuration> Código Java:
Logger final estático privado = logManager.getLogger (myApp.class); @Test public void testLog4j () {Logger.info ("Hello World!"); }}Informações do console
22: 17: 47.146 [Main] Info MyApp - Hello World!
2. Introdução ao módulo
<figuration>
| propriedade | descrever |
| MonitorInterval | Se o arquivo for modificado, a configuração será recarregada após o tempo especificado. Unidades de segundos, o valor mínimo é 5 |
| pacotes | Uma lista separada por vírgula de nomes de pacotes usados para pesquisar plug-ins, como filtros personalizados, apêndices etc. O plug-in carregará apenas uma vez, portanto, você deve reiniciar o projeto se quiser entrar em vigor após a modificação. |
| status | O nível de log interno, definindo o valor para depuração, pode ver claramente todo o fluxo de eventos de log no console. O madeireiro usado é org.apache.logging.log4j.core.logger |
| estrito | O formato XML rigoroso é permitido. A configuração JSON não é suportada |
| detalhado | Ativar informações de diagnóstico ao carregar o plug -in |
<pênder>
O LOG4J permite que as solicitações de log sejam impressas em vários destinos. No idioma log4j, o destino de saída é chamado Appender. Atualmente, os apêndeiros existem em consoles, arquivos, servidores de soquete remoto, Flume Apache, JMS, daemons Syslog Remote Unix e várias APIs de banco de dados. O seguinte introduz vários apêndeiros mais usados. Se você precisar saber mais, poderá verificar no site oficial.
1. Consoleppender
Saída para console, <Console>
Nome do parâmetro | tipo | descrever |
filtro | Filtro | Filtro |
layout | Layout | Formato de saída de log |
Seguir | booleano | |
direto | booleano | |
nome | Corda | O nome do Appender |
ignoreExceptions | booleano | Padrão true, ignore exceções de gravação |
alvo | Corda | System_out ou System_err, o padrão é System_out |
2. FilePpender
Saída para arquivo, <File>
parâmetro | tipo | descrever |
|---|---|---|
acrescentar | booleano | O padrão é verdadeiro e novos registros serão anexados ao final do arquivo |
bufferio | booleano | O padrão é verdadeiro, o uso de buffers pode melhorar significativamente o desempenho |
buffersize | int | Quando o BuffEDIO é verdadeiro, o tamanho do buffer dessa propriedade é 8192 bytes por padrão. |
Createondemand | booleano | O Appender cria arquivos sob demanda. O Appender criará esse arquivo somente quando um evento de log passar por todos os filtros e for roteado para o Appender. O valor padrão é falso |
filtro | Filtro | Um filtro para determinar se o evento deve ser tratado por este Appender. Vários filtros podem ser usados com filtros compostos |
nome do arquivo | Corda | O nome do arquivo a ser escrito. Se o arquivo ou qualquer um de seus diretórios pais não existir, eles serão criados |
flush imediato | booleano | Por padrão, true, haverá uma atualização após cada gravação. Isso garantirá que os dados do buffer sejam gravados no disco, mas podem afetar o desempenho. |
layout | Layout | Formato de log |
bloqueio | booleano | Bloqueio de arquivo, padrão false |
nome | Corda | O nome do Appender |
ignoreExceptions | booleano | Padrão true, ignore exceções de gravação |
FilePermissions | Corda | Defina permissões de arquivo Exemplo: RW ------ ou RW-RW-RW- etc ... |
Filewner | Corda | Defina o proprietário do arquivo |
FileGroup | Corda | Definir grupos de arquivos |
3. JDBCAAPPENDE
O JDBCappender usa o JDBC padrão para gravar eventos de log em tabelas de banco de dados relacionais. Ele pode ser configurado para obter uma conexão JDBC usando uma fonte de dados JNDI ou um método de fábrica personalizado. Independentemente do método, ele deve ser suportado pelo pool de conexões.
Caso contrário, o desempenho do registro será bastante afetado.
Se o driver JDBC configurado suportar instruções em lote e configurar o tamanho do buffer para um número positivo, o evento de log será em lote.
(1) <JDBC>
parâmetro | tipo | descrever |
|---|---|---|
nome | Corda | Deve, nome do appender |
ignoreExceptions | booleano | Padrão true, ignore exceções de eventos de log |
filtro | Filtro | Filtro |
buffersize | int | Se um número inteiro maior que 0, isso fará com que o Appender buffer o evento de log e atualize os dados de gravação quando o buffer atingir esse tamanho |
Conectionsource | Conectionsource | Deve ser recuperado conexão de banco de dados |
nome da mesa | Corda | Necessário, insira o nome da tabela de dados do evento de log |
ColumnConfigs | ColumnConfig [] | Deve, campos que precisam ser inseridos no banco de dados são compostos de vários elementos <Column> |
columnmappings | ColumnMapping [] | Necessário, configuração de mapeamento de campo |
(2) Use <DataSource> Para obter a conexão JDBC, apenas o JNDI está listado aqui:
| parâmetro | tipo | descrever |
|---|---|---|
| Jndiname | Corda | Necessário, se o JNDI configurado for JDBC/LoggingDatabase, o valor aqui é Java: Comp/Env/JDBC/LoggingDatabase. A fonte de dados deve ser suportada pelo pool de conexões; Caso contrário, o registro será muito lento. |
(3) Use <Colmon> para especificar quais colunas escrever na tabela e como escrevê -las. Não possui vulnerabilidade de injeção de SQL.
| parâmetro | tipo | descrever |
|---|---|---|
| nome | Corda | Necessário, nome do campo da tabela |
| padrão | Corda | Insira valores usando o modo PatternLayout. Nota: No mesmo elemento da coluna, apenas um dos três atributos de padrão, literal e iseventtimestamp pode existir no mesmo elemento da coluna. |
| literal | Corda | Este valor será incluído diretamente na instrução SQL e executado, por exemplo: a função rand () gerará números aleatórios, semelhante a $ {} em myibats |
| isEventTimestamp | booleano | Se o tempo formato java.sql.types.timestamp |
| isunicode | booleano | Esta propriedade é ignorada, a menos que um padrão seja especificado. Se verdadeiro, o valor será inserido no Unicode. Caso contrário, o valor será inserido em um não unicode. |
| isclob | booleano | Esta propriedade é ignorada, a menos que um padrão seja especificado. Se verdadeiro, o valor será inserido no clob, caso contrário, o varchar, nvarchar será inserido no |
Exemplo:
<? xml versão = "1.0" coding = "utf-8"?> <status da configuração = "error"> <pêndores> <jdbc name = "databaseppender" tableName = "dbo.application_log"> <dataSource jNDiname = "java:/comp/Env/jdbc"> isEventTimestamp="true" /> <Column name="level" pattern="%level" /> <Column name="logger" pattern="%logger" /> <Column name="message" pattern="%message" /> <Column name="exception" pattern="%ex{full}" /> </JDBC> </Appenders> <Loggers> <Root level="warn"> <AppenderRef REF = "DatabasePpender"/> </root> </loggers> </figuration><PatternLayout>
(1) Data, %d/ %Data
Padrão | Exemplo |
|---|---|
%d {padrão} | 2012-11-02 14: 34: 02.781 |
%d {iso8601} | 2012-11-02T14: 34: 02.781 |
%d {iso8601_basic} | 20121102T143402.781 |
%d {absoluto} | 14: 34: 02.781 |
%d {data} | 02 de novembro de 2012 14: 34: 02.781 |
%d {compact} | 20121102143402781 |
%d {hh: mm: ss, ss} | 14: 34: 02.781 |
%d {dd mmm yyy hh: mm: ss, ss} | 02 de novembro de 2012 14: 34: 02.781 |
%d {hh: mm: ss} {gmt+0} | 18:34:02 |
%d {unix} | 1351866842 |
%d {unix_millis} | 1351866842781 |
É claro que você também pode personalizar o formato, como %d {yyyy-mm-dd hh: mm: ss}
(2) Logger, %C/ %Logger
Padrão de conversão | Nome do Logger | resultado |
|---|---|---|
%C {1} | org.apache.commons.foo | Foo |
%C {2} | org.apache.commons.foo | Commons.foo |
%C {10} | org.apache.commons.foo | org.apache.commons.foo |
%C {-1} | org.apache.commons.foo | apache.commons.foo |
%C {-2} | org.apache.commons.foo | Commons.foo |
%C {-10} | org.apache.commons.foo | org.apache.commons.foo |
%C {1.} | org.apache.commons.foo | Oacfoo |
%C {1.1. ~. ~} | org.apache.commons.test.foo | Oa ~. ~ .Foo |
%C {.} | org.apache.commons.test.foo | .... foo |
{?} - Quando ? é um número inteiro positivo, significa que n peças são retiradas da direita e um número inteiro negativo significa que n peças são removidas da esquerda. Então, por que %C {-10} é o nome completo, eu não sei. Bem -vindo a deixar uma mensagem
(3) Informações de log,%m/%msg/%mensagem
(4) nível de log, nível %
<filtro>
O Log4j2 vem com uma variedade de filtros para uso direto, e também podemos definir filtros:
MyFilter.java
importar org.apache.logging.log4j.level; importar org.apache.logging.log4j.marker; importar org.apache.logging.log4j.threadcontext; import org.apache.logging.log4j.core.loGeVent; importger.apache.logging.logging.Log4j.Core.LoGeVent; org.apache.logging.log4j.core.config.plugins.import org.apache.logging.log4j.core.config.plugins.pluginFactory; importação org.apache.logging.log4j.core.filter.abStracttractRents; org.apache.logging.log4j.message.message; @plugin (name = "myFilter", category = "Core", elementType = "filtro", PrintObject = true) Public Class final MyFilter estende abstratoFilter {nível final privado; myFilter privado (nível de nível, resultado onmatch, resultados onMismatch) {super (onmatch, onMismatch); this.level = nível; } filtro de resultado público (logger logger, nível de nível, marcador de marcador, string msg, objeto [] params) {return filtro (nível); } filtro de resultado público (logger de logger, nível de nível, marcador de marcador, msg de objeto, throwable t) {retorna filtro (nível); } filtro de resultado público (logger de logger, nível de nível, marcador de marcador, mensagem de mensagem, throwable t) {retorna filtro (nível); } @Override Public Result Filter (Evento LogEvent) {return filtro (event.getLevel ()); } Filtro de resultado privado (nível de nível) { / * * lógica de negócios * * / retorna nivelado.ismorESPecthan (this.level)? onMatch: onMismatch; } @Override public string tostring () {return Level.toString (); } @PluginFactory public static myFilter createfilter (@pluginattribute (value = "nível", nível de nível de de padrão, "error"), @pluginattribute (value = "onmatch", defaultstring = "neutral") resultado onmatch, @plugtribute (value = "onMisming =" neutring ") resultado onmatch, @plugTribute (value =" OnMisming = ", onMisming =" neutring ") resultado, @plugTribute (value =" OnMisming = "OnMisming", e "OnMisming") Result OnMatch, @plugTribute (value = "OnMisming =" OnMisming ", e" OnMisming ") Result OnMatch, @plugtribute (value =" OnMisming = " MyFilter (nível, onmatch, onMismatch); }}log4j2.xml
<? xml versão = "1.0" coding = "utf-8"?> <status da configuração = "warn" monitorinterval = "5" packages = "seus pacotes" verbose = "fals" stric = "true"> <pêndores> <padronize <nomes " Hh: mm: ss} %nível %logger {10} - %msg "/> <myfilter nível =" info "onmatch =" aceitou "/> </sicSole> </pênders> <GGERGERS> <root nível =" info "> <ppenderref ref = console"/</root> </loggers>Reabastecer:
Em aplicativos práticos, às vezes é necessário registrar informações de acesso ao usuário, como parâmetros de solicitação, ID de usuário etc. no log4j1, usaremos o MDC e o NDC para armazenar as informações de contexto do aplicativo, enquanto o Log4J2 usa o ThreadContext para implementar as funções do MDC e do NDC.
(1) O NDC usa um mecanismo semelhante a uma pilha para armazenar informações de contexto, e os threads são independentes.
Use %x para produzir no PatternLayout, observe que x é minúsculo.
Exemplo:
Test.java
ThreadContext.push ("Hello World!");log4j2.xml
<Coluna name = "tip" padrony = "%x" />
(2) O MDC usa um mecanismo semelhante ao mapa para armazenar informações e os threads são independentes.
Use %x {userId} no padringLayout para produzir, observe que x está capitalizado.
Exemplo:
Test.java
ThreadContext.put ("UserID", "1");log4j2.xml
<Coluna name = "userId" padrony = "%x {userId}" />Observe que, depois de usá -lo, ligue para Clearall () para limpar o mapa e a pilha de contexto.
API: http://logging.apache.org/log4j/2.x/javadoc.html
Endereço oficial do site: https://logging.apache.org/log4j/2.x/index.html
O código de exemplo acima do componente de log do projeto log4j2 é todo o conteúdo que eu compartilho com você. Espero que você possa lhe dar uma referência e espero que você possa apoiar mais o wulin.com.