18 votes

Comment utiliser la commande logger sur Sierra?

Je tente de journaliser les événements/points de contrôle de mon script shell en utilisant logger.

Comment utiliser l'utilitaire logger ou syslog dans OS X (version 10.12 (16A323)). J'ai essayé

logger "Bonjour le monde" et vérifié /var/log/system.log en utilisant l'application Console, voici l'entrée de journal créée

Impossible de récolter les chaînes pour le binaire appelé '–Xó^H'

Comment utiliser logger dans OS X ? Faut-il spécifier quelque chose pour créer/ajouter une entrée au journal système OS X ?

0 votes

Pouvez-vous améliorer votre question en mentionnant pourquoi vous le souhaitez ? Cela pourrait aider les gens à trouver des options pour vous.

0 votes

J'ai pu enregistrer avec succès une entrée : $ logger "Ceci est une entrée de journal" $ echo $? 0 Puis lorsque j'ai vérifié "Tous les messages" dans ma console, mon message est apparu.

0 votes

Est-ce que cela figure sous System.log ?

11voto

Japanese Points 119

Parce que le système de journalisation d'Apple a changé dans macOS Sierra. Ils passent de la facilité de journalisation du système Apple au journalisation unifiée.

Voici un lien vers la documentation du développeur.

Le code suivant filtre le nouveau journal unifié pour le texte "Message4me"

$logger -is -t LogTest "Message4Me" 
Oct 15 13:19:27  LogTest[51173] : Message4Me

$log show --predicate 'eventMessage contains "Message4Me"' --last 3m

Skipping info and debug messages, pass --info and/or --debug to include.
Filtering the log data using "eventMessage CONTAINS "Message4Me""
Timestamp                       Thread     Type        Activity             PID    
2016-10-15 13:19:27.666574+0900 0x33b62c   Default     0x0                  51173  logger: Message4Me
 --------------------------------------------------------------------------------------------------------------------
Log      - Default:          1, Info:                0, Debug:             0, Error:          0, Fault:          0

\=======

Si vous ajoutez --info, vous verrez également le message d'événement lui-même dans la sortie.

Dans les versions précédentes du système d'exploitation, la commande logger envoyait les messages au fichier /var/log/system.log si la priorité était suffisamment élevée (par exemple en utilisant -p alert) ainsi qu'à la base de données syslog. Dans Sierra, le system.log n'est pas écrit lorsque logger est utilisé avec -p alert - pas dans la version 10.12.1 en tout cas. Cela pourrait être un bug.

Vous pouvez toujours utiliser logger pour envoyer vers le nouveau système de journalisation, mais devrez utiliser l'application Console ou l'utilitaire de journalisation en ligne de commande ou la nouvelle API pour voir les résultats.

1 votes

Il s'agit presque uniquement d'un lien et d'une réponse "peut-être". Un ~profane ne comprendra pas ce que signifient vos commandes. Veuillez ajouter quelques explications.

1 votes

Quatre mois plus tard, et le lien est déjà brisé.

0 votes

Je pense que le lien actuel est : developer.apple.com/reference/os/logging

6voto

user310346 Points 149

Pour approfondir la réponse fournie par @japanese et @arno-van-wyk...

Journalisation unifiée de macOS

Les informations suivantes sont à jour jusqu'à la version 10.15.4. Sachant qu'avec Apple, cela sera probablement obsolète dès la version 10.16.

Apple a remanié le système de journalisation de macOS dans la version 10.12 (Sierra), remplaçant le service de style syslog traditionnel par un nouveau "système de journalisation unifié". Ce nouveau système, qui n'a pas de nom formel autre que "système de journalisation unifié" (ou os_log dans les pages de manuel du système), a plusieurs objectifs - principalement axés sur le débogage des applications plutôt que sur la maintenance système. Le volume impressionnant de messages journaux générés sous ce régime est stupéfiant.

Bonne vue d'ensemble : https://eclecticlight.co/2018/03/19/macos-unified-log-1-why-what-and-how/

Concrètement, cela signifie que les événements journaux ne sont généralement pas consultables dans un fichier quelconque, par exemple /var/log/system.log, ou même dans l'application Console. Plutôt, l'utilitaire en ligne de commande log doit être utilisé ; ou l'une des applications fournies par eclecticlight.co, ci-dessus.

Génération de messages journaux

À partir de la version 10.15, l'interface syslog traditionnelle semble toujours fonctionner. Par exemple logger fonctionne.

os_log a plusieurs niveaux, dont Default, Info, Debug, et d'autres. Les niveaux syslog semblent être mappés sur ceux-ci : clairement debug > Debug, info > Info, tous les autres à Default.

Consultation des messages journaux

  • utiliser la commande log, référez-vous à la page de manuel pour les détails ; sous-commandes utiles :

    • show : interroger les journaux
      • --info et/ou --debug pour voir les journaux de niveau info/debug ; il faut fournir les deux pour obtenir les deux
      • --last time[h|m|d] : afficher les événements récents, sec/min/hrs/jours
    • stream : suivre les journaux
      • --level info|debug pour voir les messages info ; debug inclut info
      • peut fournir --process (pid|name) pour filtrer un nom de processus spécifique (raccourci pour --predicate "process ...")
    • note : les sous-commandes varient dans la façon dont le niveau de journalisation est fourni et dans le support des noms de processus (yay pour la cohérence...)
  • la sortie peut être dans quelques formats différents, y compris :

    • --style compact : le plus bref : horodatage (sans TZ), type abrégé (par exemple, Df = Default, I = Info, Db = Debug), nom du processus et PID:ID de thread, et le message journal
    • --style syslog : syslog traditionnel
    • formats JSON et JSON lines (format NDJSON aka)
    • ainsi que la forme "lisible par l'homme" complète par défaut
  • un mécanisme de "filtre" est fourni - et pratiquement requis - pour extraire les journaux désirés : --predicate [filtre]

    • un filtre est un ou plusieurs motifs de la forme "[clé] [opérateur] [valeur]", par exemple process == "logger"
      • les opérateurs de chaîne sont sensibles à la casse et aux diacritiques par défaut, ajoutez [cd] pour rendre insensible à la casse
    • les clés utiles sont
      • process : nom du processus
      • eventMessage : contenu du message
      • logType : default, info, debug, etc
    • les opérateurs utiles sont
      • ==/BEGINSWITH : correspondance de chaîne ancrée (==[cd] pour une comparaison de chaîne insensible à la casse)
      • MATCHES : regex ("Expressions régulières ICU")
        • les regex sont ancrés au début et à la fin, c'est-à-dire MATCHES "Foo" ne fera pas correspondre "Foo était ici", tandis que MATCHES "Foo.*" le fera ; MATCHES[cd] "foo.*" aussi
        • faites attention à échapper à \ depuis le shell

Exemples

Tout ce qui a été journalisé par logger au cours des 20 dernières minutes :

% for sev in alert error warning notice info debug; do
  logger -p user.$sev "log test user.$sev"
done

% log show --style compact --info --debug --predicate 'process == "logger"' --last 20m
Filtrage des données journalières utilisant "process == "logger""
Horodatage               Ty Process[PID:TID]
2020-05-22 21:06:05.697 Df logger[52036:f75d81] log test user.alert
2020-05-22 21:06:06.709 Df logger[52038:f75d8b] log test user.error
2020-05-22 21:06:07.721 Df logger[52040:f75d95] log test user.warning
2020-05-22 21:06:08.732 Df logger[52042:f75dad] log test user.notice
2020-05-22 21:06:09.741 I  logger[52044:f75db7] log test user.info
2020-05-22 21:06:10.752 Db logger[52046:f75dbc] log test user.debug

Chaque message journal de la dernière 24 heures correspondant au regex .*log\s+test.*er.*

% log show --style compact --info  --debug --predicate 'eventMessage MATCHES[cd] ".*log\\s+test.*er.*"' --last 24h
...

Flux continu des journaux de logger :

% log stream --process logger --level debug --style syslog
Filtrage des données journales utilisant "process COMMENCEPAR[cd] "logger""
Horodatage                       (processus)[PID]
2020-05-22 21:16:16.593184+1000  localhost logger[52341]: log test user.alert
2020-05-22 21:16:16.599099+1000  localhost logger[52342]: log test user.error
2020-05-22 21:16:16.604287+1000  localhost logger[52343]: log test user.warning
2020-05-22 21:16:16.608727+1000  localhost logger[52344]: log test user.notice
2020-05-22 21:16:16.613164+1000  localhost logger[52345]: log test user.info
2020-05-22 21:16:16.617368+1000  localhost logger[52346]: log test user.debug
...

1 votes

Drapeau - le style compact n'est pas pris en charge sur les anciennes versions de Mac OSX, par exemple Sierra (10.12.6). Certaines personnes peuvent être bloquées sur des versions antérieures en raison du matériel plus ancien. - le style syslog ou le style json fonctionnent pour Sierra.

2voto

Jeff Holland Points 21

J'ai résolu ce problème en ayant un script qui utilise netcat pour envoyer des journaux spécifiques toutes les 10 minutes à partir d'un launchdaemon. Modifiez selon vos besoins.

#!/bin/bash

while read line    
do
    #supprimer les entrées de journal dans le fichier journal que vous ne voulez pas envoyer au serveur syslog
    if [[ "$line" =~ ^.*recurring\ check-in.* || "$line" =~ ^.*Executing\ Policy\ Update\ Inventory.* ]]; then
     /bin/echo "" > /dev/null;
   else
     ## envoyer les journaux au serveur syslog en utilisant netcat. Modifiez l'IP et le port UDP si nécessaire
     echo $line | nc -v -u -w 0 10.10.1.9 514
   fi
done < /var/log/system.log

1voto

klanomath Points 63400

Ce n'est pas une réponse réelle mais une solution de contournement et trop longue pour un commentaire.

J'ai rencontré le même problème dans Sierra en essayant de journaliser un script shell de mise à jour de Homebrew incluant des commandes logger (qui fonctionnaient dans El Capitan). J'ai dû abandonner logger et simplement utilisé echo, la redirection de sortie et un nouveau fichier journal :

#!/bin/bash

Brew=/usr/local/bin/brew
Brewup_Log=/Users/user/Library/Logs/brewup.log

echo "$(date "+%Y.%m.%d %H:%M:%S")" >> $Brewup_Log 2>&1
$Brew update 2>&1 >>$Brewup_Log
....

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X