====== Rotando logs en Jira / Confluence con logrotate (Opción 1) ======
Los logs de Jira / Confluence se pueden dividir en dos grupos, los del servidor (Tomcat) y los propios del Framework (Jira / Confluence).
En esta guía se mostrará la forma más limpia de hacerlo, que en resumen es, desactivar la rotación y modificar el formato de logs en los ficheros de configuración para cederle así todo el control a logrotate. Jira y Confluence utilizan log4j con su configuración predeterminada, el servidor Tomcat basa su configuración en los ficheros //server.xml// y //logging.properties//.
**Información sobre rotación de logs**: How to Rotate Catalina Log File
==== Activar / definir el nivel de logs en JIRA / Confluence (Optativo) ====
De forma no permanente en la sección de administración del framework
De forma permanente en el fichero: //log4j.properties//
log4j.logger.com.atlassian = XXXXX, console, filelog
Levels (XXXXX): 'DEBUG', 'INFO', 'WARN', 'ERROR' und 'FATAL'.
==== Políticas para configurar los logs de esta guía ====
- Desactivar la configuración Nativa de Tomcat / Jira evitando rotación y creación de logs con fecha como sufijo.
- Para evitar reiniciar los servicios, truncaremos los ficheros de logs.
- Rotaremos con compresión de forma diaria, dejando el último log sin comprimir.
- Pondremos la fecha como sufijo.
- Se mantendrán únicamente los logs con antigüedad de una semana.
- No rotaran ficheros vacíos.
==== Directorio donde JIRA y Confluence almacenan los logs ====
**Jira framework**: ///opt/atlassian/jira/logs///
**Jira Tomcat**: ///var/atlassian/application-data/jira/log///
**Configuración de logs**: ///opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties//
**Confluence framework**: ///var/atlassian/application-data/confluence/logs///
**Confluence Tomcat**: ///opt/atlassian/confluence/logs///
**Configuración de logs**: ///opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties//
=== Tomcat logs (Jira und Confluence) y sus ficheros de configuración ===
access_log.log: //server.xml// (Depende de la configuración realizada)
catalina.out: //catalina.sh// || //setenv.sh// || //logging.properties//
catalina.log: (//catalina.log// es un "resumen" de //catalina.out//)
host-manager.log: //logging.properties//
manager.log: //logging.properties//
localhost.log: //logging.properties//
NOTA: Se suelen crear / modificar cuando se reinicia el sistema / servicio.
=== Jira logs (/var/atlassian/jira/) y sus ficheros de configuración ===
atlassian-jira.log: //log4j.properties//
atlassian-jira-security.log: //log4j.properties//
atlassian-greenhopper.log: //log4j.properties//
atlassian-bonfire.log: //log4j.properties//
atlassian-jira-security.log: //log4j.properties//
=== Confluence logs (/var/atlassian/confluence/) y sus ficheros de configuración ===
atlassian-confluence.log: //log4j.properties//
NOTA: El fichero //atlassian-jira-security.log// puede contener passwords si se configura el nivel de logs en modo "DEBUG"
==== Configuración de Jira para usar con logrotate. ====
Se configurará el fichero //log4j.properties// para que no rote logs hasta que estos superen 1 Gb, así nos aseguramos que logrotate llegue antes de que eso ocurra.
service jira stop
cp /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties_backup
sed 's/20480KB/1048576KB/g' /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties > log4j.properties_1G
mv log4j.properties_1G /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties
Editamos la linea 167 del fichero ///opt/atlassian/jira/conf/server.xml//
valve classname="org.apache.catalina.valves.AccessLogValve" pattern="combined" resolvehosts="false" rotatable="false" suffix="log"
El fichero //logging.properties// en jira v6.1 viene en formato "DOS", si estamos en entornos Unix es mejorar pasarlo a formato Unix.
cp /opt/atlassian/jira/conf/logging.properties /opt/atlassian/jira/conf/logging.properties_backup
perl -pi -e 's/\r\n/\n/g' /opt/atlassian/jira/conf/logging.properties
Editamos el fichero ///opt/atlassian/jira/conf/logging.properties// a partir de la linea 25.
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina
1catalina.org.apache.juli.FileHandler.rotatable = false
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
2localhost.org.apache.juli.FileHandler.rotatable = false
2localhost.org.apache.juli.FileHandler.suffix = log
3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.rotatable = false
3manager.org.apache.juli.FileHandler.suffix = log
4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.
4host-manager.org.apache.juli.FileHandler.rotatable = false
4host-manager.org.apache.juli.FileHandler.suffix = log
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
############################################################
service jira start
==== Configuración de logrotate para Jira ====
Creamos los ficheros ///etc/logrotate.d/jira_tomcat// y ///etc/logrotate.d/jira//.
Archivo /etc/logrotate.d/jira_tomcat
/opt/atlassian/jira/logs/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
/opt/atlassian/jira/logs/*.out {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
Archivo /etc/logrotate.d/jira
/var/atlassian/application-data/jira/log/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
}
==== Configuración de Confluence para usar con logrotate ====
Se configurará el fichero //log4j.properties// para que no rote logs hasta que estos superen 1 Gb, así nos aseguramos que logrotate llegue antes de que eso ocurra.
service confluence stop
cp /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties_backup
sed 's/20480KB/1048576KB/g' /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties > log4j.properties_1G
mv log4j.properties_1G /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties
Editamos el fichero ///opt/atlassian/confluence/conf/logging.properties// a partir de la linea 25.
############################################################
# Handler specific properties.
# Describes specific configuration info for Handlers.
############################################################
1catalina.org.apache.juli.FileHandler.level = FINE
1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.FileHandler.prefix = catalina
1catalina.org.apache.juli.FileHandler.rotatable = false
2localhost.org.apache.juli.FileHandler.level = FINE
2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.FileHandler.prefix = localhost.
2localhost.org.apache.juli.FileHandler.rotatable = false
2localhost.org.apache.juli.FileHandler.suffix = log
3manager.org.apache.juli.FileHandler.level = FINE
3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
3manager.org.apache.juli.FileHandler.prefix = manager.
3manager.org.apache.juli.FileHandler.rotatable = false
3manager.org.apache.juli.FileHandler.suffix = log
4host-manager.org.apache.juli.FileHandler.level = FINE
4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs
4host-manager.org.apache.juli.FileHandler.prefix = host-manager.
4host-manager.org.apache.juli.FileHandler.rotatable = false
4host-manager.org.apache.juli.FileHandler.suffix = log
java.util.logging.ConsoleHandler.level = FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
############################################################
service confluence start
==== Configuración de logrotate para Confluence ====
Creamos los ficheros ///etc/logrotate.d/confluence// y ///etc/logrotate.d/confluence_tomcat//
Archivo ///etc/logrotate.d/confluence_tomcat//
/opt/atlassian/confluence/logs/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
/opt/atlassian/confluence/logs/*.out {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
Archivo ///etc/logrotate.d/confluence_tomcat//
/var/atlassian/application-data/confluence/logs/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
==== Configuración de logs después de actualizar JIRA / Confluence ====
Sería suficiente con tener una copia de seguridad de la anterior instancia, parar el servicio y sustituir los siguientes ficheros.
**Jira**: //logging.properties// y //server.xml//
**Confluence**: //logging.properties// y //log4j.properties//
==== Instalar crond / crontabs (CentOS / RedHat) ====
yum install crontabs
service crond start
chkconfig crond on
NOTA: SeLinux debe desactivarse o bien configurarse a medida, en caso contrario la rotación de logs automática fallará. Si se ejecuta logrotate desde la linea de comando como root veremos que se ejecuta todo correctamente, pero si delegamos la tarea en cron / crontab esta fallará si SeLinux está activo. Esto puede depender de la distribución utilizada y la configuración de logrotate. En redHat / CentOS con esta configuración dada es altamente recomendable desactivar SeLinux (o configurarlo para que permita la rotación).
Salida de ///var/log/messages//
logrotate: ALERT exited abnormally with [1]
**SeLinux log**: ///var/log/audit/audit.log//
type=SYSCALL msg=audit(1385260621.900:1755): arch=c000003e syscall=2 success=no exit=-13 a0=7ffff9ef0500 a1=90800 a2=203b7d0 a3=2f617461642d6e6f items=0 ppid=10146 pid=10148 auid=0 uid=0 gid=0 euid=0 suid=0 fsuid=0 egid=0 sgid=0 fsgid=0 tty=(none) ses=102 comm="logrotate" exe="/usr/sbin/logrotate" subj=system_u:system_r:logrotate_t:s0-s0:c0.c1023 key=(null)
type=AVC msg=audit(1385260621.902:1756): avc: denied { write } for pid=10148 comm="logrotate" name="catalina.2013-11-22.log" dev=dm-0 ino=6908 scontext=system_u:system_r:logrotate_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:usr_t:s0 tclass=file
----
====== Rotando logs en Jira / Confluence con logrotate (Opción 2) ======
**Activar / definir el nivel de logs en JIRA / Confluence** (Optativo):[[logrotate_en_jira_confluence#activar_definir_el_nivel_de_logs_en_jira_confluence_optativo| Leer]]\\
**Directorio donde JIRA y Confluence almacenan los logs**: [[logrotate_en_jira_confluence#directorio_donde_jira_y_confluence_almacenan_los_logs| Leer]]\\
**Instalar crond / crontabs (CentOS / RedHat)**:[[logrotate_en_jira_confluence#instalar_crond_crontabs_centos_redhat| Leer]]
==== Políticas para configurar los logs de esta guía ====
- NO se desactivará la configuración Nativa de Tomcat / Jira para evitar la rotación y creación de logs.
- Para evitar reiniciar los servicios, truncaremos los ficheros de logs.
- Rotaremos con compresión de forma diaria, dejando el último log sin comprimir.
- No rotaremos los logs de acceso con compresión
- Pondremos la fecha como sufijo.
- Se mantendrán únicamente los logs con antigüedad de una semana.
- No rotaran ficheros vacíos.
==== Configuración de Jira para usar con logrotate ====
El fichero de configuracion de los logs "//log4j.properties//" será modificado para que los logs sean rotados por Tomcat al llegar a 1Gb, de esa forma nos aseguramos de que logrotate llegue antes.
service jira stop
cp /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties_backup
sed 's/20480KB/1048576KB/g' /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties > log4j.properties_1G
mv log4j.properties_1G /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties
service jira start
==== Configuración de logrotate para Jira ====
Crear los ficheros ///etc/logrotate.d/jira_tomcat// y ///etc/logrotate.d/jira//
Fichero ///etc/logrotate.d/jira_tomcat//
/opt/atlassian/jira/logs/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
/opt/atlassian/jira/logs/*.out {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
}
Fichero ///etc/logrotate.d/jira//
/var/atlassian/application-data/jira/log/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
postrotate
find /var/atlassian/application-data/jira/log -type f -empty -mtime +3 -exec rm {} \;
#Die leere Tomcat Logs wird nach 3 Tage mit keiner Bearbeitung gelöscht / access_log Dateien ab 7 tage eliminieren (logrotate kann es nicht allein machen)
find /opt/atlassian/jira/logs/ -type f -empty -mtime +3 -exec rm {} \;
find /opt/atlassian/jira/logs/ -type f -name "access_log.*" -mtime +6 -exec rm {} \;
endscript
}
==== Configuración de Confluence para usar con logrotate ====
Lo mismo que en Jira, el fichero de configuracion de los logs "//log4j.properties//" será modificado para que los logs sean rotados por Tomcat al llegar a 1Gb, de esa forma nos aseguramos de que logrotate llegue antes.
service confluence stop
cp /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties_backup
sed 's/20480KB/1048576KB/g' /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties > log4j.properties_1G
mv log4j.properties_1G /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties
service confluence start
==== Configuración de logrotate para Confluence ====
Crear los ficheros ///etc/logrotate.d/confluence_tomcat// y ///etc/logrotate.d/confluence//.
Fichero ///etc/logrotate.d/confluence_tomcat//
/opt/atlassian/confluence/logs/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
postrotate
#Die leere Logs wird nach 3 Tage mit keiner Bearbeitung gelöscht
find /opt/atlassian/confluence/logs/ -type f -empty -mtime +3 -exec rm {} \;
endscript
}
/opt/atlassian/confluence/logs/*.out {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
Fichero ///etc/logrotate.d/confluence//
/var/atlassian/application-data/confluence/logs/*.log {
copytruncate
notifempty
daily
dateext
dateformat __%d-%m-%Y
rotate 7
delaycompress
compress
missingok
}
==== Configuración de logs después de actualizar JIRA / Confluence ====
**Jira**
service jira stop
cp /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties_backup
sed 's/20480KB/1048576KB/g' /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties > log4j.properties_1G
mv log4j.properties_1G /opt/atlassian/jira/atlassian-jira/WEB-INF/classes/log4j.properties
service jira start
**Confluence**
service confluence stop
cp /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties_backup
sed 's/20480KB/1048576KB/g' /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties > log4j.properties_1G
mv log4j.properties_1G /opt/atlassian/confluence/confluence/WEB-INF/classes/log4j.properties
service confluence start
====== Documentación de interés ======
* **Access Log Valve**: [[http://tomcat.apache.org/tomcat-7.0-doc/config/valve.html#Access_Log_Valve]]
* **catalina.out format**: [[http://www.tomcatexpert.com/knowledge-base/rotating-catalinaout-log-files]]
* **FileHandler**: [[http://tomcat.apache.org/tomcat-6.0-doc/api/org/apache/juli/FileHandler.html]]