Vote utilisateur: 5 / 5

Etoiles activesEtoiles activesEtoiles activesEtoiles activesEtoiles actives
 

Les traitements shells nécessitent souvent de tracer les compte-rendus dans un fichier de trace.

Voici deux petites fonctions très utiles qui permettront de le faire en choisissant votre niveau de trace ainsi qu'un exemple d'utilisation

 Le fichier Trace_Lib.sh -->

Déclaration des variables de niveau de trace
#!/usr/bin/ksh
export LOG_CRITIQUE=5
export LOG_ERREUR=4
export LOG_WARNING=3
export LOG_NORMAL=2
export LOG_DEBUG=1
 
export LOG_LABELS[$LOG_CRITIQUE]=C
export LOG_LABELS[$LOG_ERREUR]=E
export LOG_LABELS[$LOG_WARNING]=W
export LOG_LABELS[$LOG_NORMAL]=N
export LOG_LABELS[$LOG_DEBUG]=D
 
export LOG_LEVEL=${LOG_LEVEL:-$LOG_NORMAL} 


Fonction de trace
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
 
function fEcritLog
{
    lv_Mess="$1"
    typeset -i lv_NivMess
    if [[ "$2" = "" ]]; then
        lv_NivMess=$LOG_NORMAL
    else
        lv_NivMess=$2
    fi
 
    # Variables
    typeset -R7  lv_nPID=$$
    typeset -L30 lv_Script=${sv_NomScript:-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx}
 
    # Verification du niveau
    if [[ $lv_NivMess -lt $LOG_DEBUG ]]; then
        lv_NivMess=$LOG_DEBUG
    elif [[ $lv_NivMess -gt $LOG_CRITIQUE ]]; then
        lv_NivMess=$LOG_CRITIQUE
    fi
 
    # On ne trace que les messages avec un niveau superieur au niveau de trace
    if [[ $lv_NivMess -lt ${LOG_LEVEL} ]]; then return 0; fi
 
    # Calcul type en fonction du niveau
    lv_TypeMess=${LOG_LABELS[$lv_NivMess]}
 
    # Ecriture
    echo "$lv_Mess" | while read lv_Ligne
    do
        echo "$(date +'%H:%M:%S') ${lv_nPID} ${lv_Script} ${lv_TypeMess} ${lv_Ligne}" | tee -a ${sv_LOGFILE}
    done
}
#------------------------- Fin de la fonction fEcritLog ------------------------
#---------------------------------------------------------------------------- 

 

Une fonction qui écrit toute les lignes d'un fichier de trace dans le fichier de trace principal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
#------------------------ Debut de la fonction fEcritFicLog -----------------------
# Ecriture dans la log d'un fichier (plusieurs lignes)
# Argument 1 : nom du fichier
# Argument 2 : niveau de trace
function fEcritFicLog
{
    typeset lv_Fic="$1"
    typeset lv_Ligne
    if [[ ! -r ${lv_Fic} ]]; then
        fEcritLog "Fichier ${lv_Fic} inexistant" "$2"
    else
        cat ${lv_Fic} | while read lv_Ligne
        do
            fEcritLog "> ${lv_Ligne}" "$2"
        done
    fi
}
#------------------------- Fin de la fonction fEcritFicLog ------------------------ 

 Fin de la bibliothèque de fonction de trace --

Utilisation des fonctions dans un script -->

Exemple d'utilisation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
 
export sv_NomScript='GestionUnix.sh' 
export sv_LOGFILE=`pwd`'/TRACE_${sv_NomScript}_'`date +"%Y%m%d_%H%M"`'.log'
 
#
# Déclaration des tableaux contenant les répertoires à créer
DIR_APP[0]="env"
DIR_APP[1]="ksh"
DIR_APP[2]="sql"
DIR_APP[3]="tmp"
typeset -i NB_APP=4
 
DIR_CFT[0]="data/in"
DIR_CFT[1]="data/out"
DIR_CFT[2]="data/err"
DIR_CFT[3]="data/log"
DIR_CFT[4]="data/arch"
typeset -i NB_CFT=5
 
DIR_NAS[0]="/shr"
typeset -i NB_NAS=1
 
#
# Appel de la bibliothèque de fonctions à utiliser
. PWC_ENV_Lib.sh
 
fEcritLog " "
fEcritLog "------------------------------------------------------------"
fEcritLog "---        Gestion de l'environnement Unix - DEBUT       ---"
fEcritLog "------------------------------------------------------------"
fEcritLog " "
 
# Contrôle des paramètres passés en arguments
if [[ $# != 6 ]]
then
    fEcritLog "Nombre de parametres passes en arguments insuffisant : $#" $LOG_ERREUR
    return 99
fi
lv_uenv=$1
lv_env=$2
lv_app=$3
lv_ENV=$4
lv_APP=$5
lv_DIRPATH=$6
 
#
#
# Controle du user unix qui doit lancer le script
lv_runusr=$(whoami)
lv_envusr=et${lv_env}${lv_app}
 
if [[ ${lv_runusr} != ${lv_envusr} ]]
then 
 fEcritLog "Le user unix utilisé pour lancer le script n'est pas le bon : " $LOG_ERREUR
 fEcritLog "$lv_runusr au lieu de $lv_envusr." $LOG_ERREUR
 fEcritLog "Connectez vous en tant que $lv_envusr et relancer le script avec les paramètres saisis" $LOG_ERREUR
 sleep 3
 return 99
fi
 
#
# Sauvegarde du .profile existant
mv /home/et${lv_env}${lv_app}/.profile /home/et${lv_env}${lv_app}/profile.`date +"%Y%m%d%H%M"`
if [[$? !=0 ]]
then
    fEcritLog "Sauvegarde du fichier .profile du user Unix en erreur" 4
    return 99
else
    fEcritLog "Sauvegarde du fichier .profile du user Unix effectuee"
fi
#
# Copie du fichier modèle en .profile
cp ${lv_DIRPATH}/PWC_ENV_ProfileModel.txt /home/et${lv_env}${lv_app}/profile.tmp
if [[$? !=0 ]]
then
    fEcritLog "Copie du fichier modèle PWC_ENV_ProfileModel.txt en erreur" 4
    return 99
else    
    fEcritLog "Copie du nouveau fichier .profile du user Unix effectuee"
fi 

 

La fonction fEcritLog prend deux paramètres : Le texte à logguer et le niveau de log de ce texte.
Par défaut le niveau de trace est placé à Normal. Donc il est possible de spécifier dans les scripts de traitements des messages de type DEBUG qui ne seront loggués dans le fichier de trace que si le niveau de log minimum est modifié.

Pour  modifier ce niveau de log minimum : il faut modifier dans la bibliothèque Trace_Lib.sh les lignes suivantes : 

export LOG_LEVEL=${LOG_LEVEL:-$LOG_NORMAL}