16 septembre 2020

log4j : Envoi de mail sur présence d'une erreur fatale

Le guide technique présente une astuce pour remonter un incident Java par mail via le fichier log4j (typiquement en cas d'erreur fatale de l'application). Utile si vous ne disposez pas d'outil de surveillance sur la machine.

Ci dessous un exemple avec le serveur HRD Query :

Mises à jour dans le fichier query/conf/query_log.properties

  • Au niveau des loggers :

# Ajout de la sortie "mail"
log4j.rootLogger = INFO, consoleappender, fileappender, mailappender
log4j.logger.com.hraccess = INFO, consoleappender, fileappender, mailappender

  • Ajout de la définition de l'appender :


# appender MAIL
# Définition du niveau de trace de l'appender
log4j.appender.mailappender.Threshold=FATAL
# Définition du type d'appender

log4j.appender.mailappender=org.apache.log4j.net.SMTPAppender
# Formatage des messages
log4j.appender.mailappender.layout=org.apache.log4j.PatternLayout
log4j.appender.mailappender.layout.ConversionPattern=%d [%t] %-5p %c -%m%n

# Destinataire,
Emetteur, Sujet du mail
log4j.appender.mailappender.To=admin@digix.com,john.doe@digix.com
log4j.appender.mailappender.Fr
om=nePasRepondre@digix.com
log4j.appender.mailappender.Subject=Erreur Fatale HRD Query
# Serveur de courrier de l'entreprise
log4j.appender.mailappender.SMTPHost=
smtp.digix.com

  •  Arrêt / démarrage du serveur HRDQuery

 

9 septembre 2020

make - erreur fatale: sqlcpr.h : Aucun fichier ou dossier de ce type

Sur une de mes plateformes, lors de la recompilation de programmes C (make all), des erreurs apparaissent sur les programmes DNA4 et DNA8 :

---
---    APC.c   -->  APC.o
---
cc -D_SIGA_TYPE_MONO -m64 -fPIC -c APC.c
cc -D_SIGA_TYPE_MONO -m64 -fPIC  -O             -c -o DNA4.o DNA4.c
DNA4.c:334:22: erreur fatale: sqlcpr.h : Aucun fichier ou dossier de ce type
 #  include <sqlcpr.h>
                      ^
compilation terminée.
make: *** [DNA4.o] Erreur 1

et

DNA8.c:394:22: erreur fatale: sqlcpr.h : Aucun fichier ou dossier de ce type
 #  include <sqlcpr.h>
                      ^
compilation terminée.
make: *** [DNA8.o] Erreur 1

Il se trouve que le répertoire contient des fichiers source DNA*.c et des DNA*.pc

Ces sources nécessitent une précompilation Oracle.
Pour que le makefile considère en priorité les sources ".pc" il faut donc :

  • soit retirer les ".c" (rm)
  • soit mettre à jour l'horodatage des ".pc" (touch).

Sans cela c'est une commande de compilation C classique qui est lancée, et les appels Oracle ne sont pas compris. 


Exemple :

rm -f DNA4.c

make DNA4.o

---
---    DNA4.pc   -->  DNA4.o
---

Pro*C/C++: Release 19.0.0.0.0 - Production on Wed Sep 9 14:52:59 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

System default option values taken from: /app/oracle/client/product/19.0.0/client_1/precomp/admin/pcscfg.cfg

cc -D_SIGA_TYPE_MONO -m64 -fPIC -c  -I/app/oracle/client/product/19.0.0/client_1/precomp/hdrs  -I/app/oracle/client/product/19.0.0/client_1/precomp/public -I/app/oracle/client/product/19.0.0/client_1/precomp/include   -I/app/oracle/client/product/19.0.0/client_1/oracore/include -I/app/oracle/client/product/19.0.0/client_1/oracore/public -I/app/oracle/client/product/19.0.0/client_1/oracore/port/include -I/app/oracle/client/product/19.0.0/client_1/xdk/include -I/app/oracle/client/product/19.0.0/client_1/xdk/public -I/app/oracle/client/product/19.0.0/client_1/nlsrtl/include  -I/app/oracle/client/product/19.0.0/client_1/ldap/public/sslinc -I/app/oracle/client/product/19.0.0/client_1/ldap/include/sslinc -I/app/oracle/client/product/19.0.0/client_1/ldap/include/cryptoinc  -I/app/oracle/client/product/19.0.0/client_1/slax/include   -I. DNA4.c

ls -lrt DNA4*
18536 2016-12-15 15:37 DNA4.pc
    0 2020-09-09 14:52 DNA4.lis
35270 2020-09-09 14:52 DNA4.c
18608 2020-09-09 14:52 DNA4.o

Une autre option est de préciser explicitement dans le $SIGACS/adm/src/Makefile la règle de compilation pour ces programmes. Ajouter alors (avant la règle ".pc.o:  $(*).pc") deux chapitres sur le modèle de celui indiquant la règle ".pc.o:  $(*).pc".

Dans mon cas :

#----------------------------------------------------------------
#       Build the object module DNA4.o
#
DNA4.o: DNA4.pc
        @echo "--- "
        @echo "---    DNA4.pc   -->  DNA4.o "
        @echo "--- "
        @$(PROC) $(PCCFLAGS) iname=DNA4.pc oname=DNA4.c
        $(CC) -c $(DEFINE_PROC) $(INCLUDE) DNA4.c
#----------------------------------------------------------------
#       Build the object module DNA8.o
#
DNA8.o: DNA8.pc
        @echo "--- "
        @echo "---    DNA8.pc   -->  DNA8.o "
        @echo "--- "
        @$(PROC) $(PCCFLAGS) iname=DNA8.pc oname=DNA8.c
        $(CC) -c $(DEFINE_PROC) $(INCLUDE) DNA8.c