Maison développement back-end Golang Tutoriel d'utilisation simple de Golang Logrus

Tutoriel d'utilisation simple de Golang Logrus

May 25, 2021 pm 02:40 PM
golang

Ce qui suit est un tutoriel simple d'utilisation de Golang Logrus de la colonne tutoriel golang. J'espère qu'il sera utile aux amis dans le besoin !

Tutoriel facile à utiliser de Golang Logrus

La manière la plus simple d'utiliser Logrus :

package main
import (
  log "github.com/sirupsen/logrus"
)
func main() {
  log.WithFields(log.Fields{
    "animal": "walrus",
  }).Info("A walrus appears")
}
Copier après la connexion

Veuillez noter qu'il est entièrement compatible avec l'API avec stdlib logger, donc Vous pouvez remplacer l'importation n'importe où dans le journal, connectez-vous "github.com/sirupsen/logrus" . Vous pouvez également tout personnaliser :

package main
import (
  "os"
  log "github.com/sirupsen/logrus"
)
func init() {
  // Log 为JSON而不是默认的ASCII格式。
  log.SetFormatter(&log.JSONFormatter{})
  // 输出到标准输出,而不是默认的标准错误
  //可以是任何io.Writer,请参阅下面的文件例如日志。
  log.SetOutput(os.Stdout)
  // 仅记录严重警告以上。
  log.SetLevel(log.WarnLevel)
}
func main() {
  log.WithFields(log.Fields{
    "animal": "walrus",
    "size":   10,
  }).Info("A group of walrus emerges from the ocean")
  log.WithFields(log.Fields{
    "omg":    true,
    "number": 122,
  }).Warn("The group's number increased tremendously!")
  log.WithFields(log.Fields{
    "omg":    true,
    "number": 100,
  }).Fatal("The ice breaks!")
  // 一种常见的模式是通过重用
  //从WithFields返回的logrus.Entry 来重用日志记录语句之间的字段
  contextLogger := log.WithFields(log.Fields{
    "common": "this is a common field",
    "other": "I also should be logged always",
  })
  contextLogger.Info("I'll be logged with common and other field")
  contextLogger.Info("Me too")
}
Copier après la connexion

Pour une utilisation plus avancée, pour un grand projet, une instance globale de logrus, c'est-à-dire l'objet logger, est souvent nécessaire pour enregistrer tous les logs du projet. Un exemple est :

package main
import (
  "os"
  "github.com/sirupsen/logrus"
)
// 创建记录器的一个新实例。您可以有任意多个实例
var log = logrus.New()
func main() {
  // 用于设置属性的API与程序包级别
  // 导出的记录器有些不同。见Godoc。
  log.Out = os.Stdout
  // 您可以将其设置为任何`io.Writer`
  // file, err := os.OpenFile("logrus.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
  // if err == nil {
  //  log.Out = file
  // } else {
  //  log.Info("Failed to log to file, using default stderr")
  // }
  log.WithFields(logrus.Fields{
    "animal": "walrus",
    "size":   10,
  }).Info("A group of walrus emerges from the ocean")
}
Copier après la connexion

Fields :

Logrus encourage une journalisation structurée et minutieuse via des champs de journalisation plutôt que des messages d'erreur longs et impossibles à analyser. Par exemple, au lieu de : log.Fatalf("Failed to send event %s to topic %s with key %d"), vous devez utiliser :

log.WithFields(log.Fields{
  "event": event,
  "topic": topic,
  "key": key,
}).Fatal("Failed to send event")
Copier après la connexion

Nous avons constaté que cette API vous oblige à réfléchir dans l'ordre pour produire des enregistrements de journal plus utiles sous la forme de messages de journal. Nous avons rencontré d'innombrables situations dans lesquelles le simple ajout d'un champ à une instruction de journal déjà existante nous a fait gagner du temps. L'appel WithFields est facultatif.

En général, l'utilisation de l'une des fonctions de la famille printf avec Logrus doit être considérée comme un indice et vous devez ajouter un champ, cependant, vous pouvez toujours utiliser les fonctions de la famille printf avec Logrus.

Champs par défaut

Il est souvent utile de toujours joindre des champs aux instructions de journal dans votre application ou une partie d'une application. Par exemple, vous souhaiterez peut-être toujours enregistrer request_id et user_ip dans le contexte d'une requête. Au lieu d'écrire log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip}) sur chaque ligne, vous pouvez créer un logrus.Entry en passant :

requestLogger := log.WithFields(log.Fields{"request_id": request_id, "user_ip": user_ip})
requestLogger.Info("something happened on that request") # will log request_id and user_ip
requestLogger.Warn("something not great happened")
Copier après la connexion

Hooks

Vous pouvez ajouter des hooks pour les niveaux de journalisation. Par exemple, envoyez les erreurs au service de suivi des exceptions sur les informations d'erreur, de fatalité et de panique à StatsD ou enregistrez-vous à plusieurs emplacements en même temps, tels que Syslog.

Logrus est livré avec des crochets intégrés. Ajoutez-les ou votre hook init personnalisé :

import (
  log "github.com/sirupsen/logrus"
  "gopkg.in/gemnasium/logrus-airbrake-hook.v2" // the package is named "airbrake"
  logrus_syslog "github.com/sirupsen/logrus/hooks/syslog"
  "log/syslog"
)
func init() {
  // Use the Airbrake hook to report errors that have Error severity or above to
  // an exception tracker. You can create custom hooks, see the Hooks section.
  log.AddHook(airbrake.NewHook(123, "xyz", "production"))
  hook, err := logrus_syslog.NewSyslogHook("udp", "localhost:514", syslog.LOG_INFO, "")
  if err != nil {
    log.Error("Unable to connect to local syslog daemon")
  } else {
    log.AddHook(hook)
  }
}
Copier après la connexion

Remarque : les hooks Syslog prennent également en charge la connexion au syslog local (tel que "/dev/log" ou "/var/run/syslog" ou "/var /run/ enregistrer"). Pour plus de détails, consultez le fichier README des hooks Syslog.

Une liste des hooks de service actuellement connus peut être trouvée sur cette page wiki.

Niveaux de journalisation

Logrus dispose de sept niveaux de journalisation : trace, débogage, informations, avertissement, erreur, critique et urgence.

log.Trace("Something very low level.")
log.Debug("Useful debugging information.")
log.Info("Something noteworthy happened!")
log.Warn("You should probably take a look at this.")
log.Error("Something failed but I'm not quitting.")
// Calls os.Exit(1) after logging
log.Fatal("Bye.")
// Calls panic() after logging
log.Panic("I'm bailing.")
Copier après la connexion

Vous pouvez définir le niveau de journalisation sur Logger et il n'enregistrera alors que les entrées avec cette gravité ou plus :

// Will log anything that is info or above (warn, error, fatal, panic). Default.
log.SetLevel(log.InfoLevel)
Copier après la connexion

log.Level = logrus.DebugLevel si appliqué Si votre programme a un débogage ou un environnement verbeux, il peut être utile de l'installer ici.

Entrées

En plus des champs ajoutés WithField ou WithFields certains champs seront automatiquement ajoutés à tous les événements de journalisation :

heure. L'horodatage de la création de l'entrée.

msg. Le message de journal transmis à AddFields après avoir appelé {Info, Warn, Error, Fatal, Panic}. Par exemple, Échec de l'envoi de l'événement.

niveau. Niveau de journalisation. Par exemple des informations.

Environnement

Logrus n'a aucune notion d'environnement.

Si vous souhaitez utiliser des hooks et des formateurs uniquement dans un environnement spécifique, vous devez le gérer vous-même. Par exemple, si votre application possède une variable globale Environment, qui est une représentation sous forme de chaîne de l'environnement, vous pouvez effectuer ce qui suit :

import (
  log "github.com/sirupsen/logrus"
)
init() {
  // do something here to set environment depending on an environment variable
  // or command-line flag
  if Environment == "production" {
    log.SetFormatter(&log.JSONFormatter{})
  } else {
    // The TextFormatter is default, you don't actually have to do this.
    log.SetFormatter(&log.TextFormatter{})
  }
}
Copier après la connexion

Cette configuration est utilisée comme prévu par logrus, mais le JSON en production uniquement. n'est utile que lors de l'utilisation d'outils tels que Splunk ou Logstash pour l'agrégation de journaux.

Formatter

Le formateur de journal intégré est :

logrus.TextFormatter. Les événements sont enregistrés en couleur si la sortie standard est un terminal, sinon les événements sont enregistrés en couleur.

Remarque : Pour forcer la sortie des couleurs lorsqu'il n'y a pas d'ATS, définissez le champ ForceColors sur true. Pour ne pas forcer la sortie en couleur même avec un TTY, définissez le champ DisableColors sur true. Pour Windows, consultez github.com/mattn/go-colorable.

Lorsque les couleurs sont activées, les niveaux seront tronqués à 4 caractères par défaut. Pour désactiver la troncature, définissez le champ DisableLevelTruncation sur true.

Lors de la sortie vers un ATS, il est souvent utile de parcourir visuellement les colonnes où tous les niveaux ont la même largeur. Activez ce comportement en ajoutant un remplissage au texte du niveau, en définissant le champ PadLevelText sur true.

Toutes les options sont répertoriées dans la documentation générée.

logrus.JSONFormatter. Enregistrez les champs au format JSON.

Toutes les options sont répertoriées dans la documentation générée.

Formateur de journaux tiers :

FluentdFormatter. Formatez les entrées qui peuvent être analysées par Kubernetes et Google Container Engine.

GELF. Formatez les entrées pour qu'elles soient conformes à la spécification GELF 1.1 de Graylog.

logstash. Consigner les champs en tant qu’événements Logstash.

préfixé. Affiche les sources d'entrée du journal ainsi que des mises en page alternatives.

zalgo. Faites appel au pouvoir de Zalgo.

formateur de logrus imbriqué. Convertissez les champs logarithmiques en structures imbriquées.

powerful-logrus-formatter。打印日志时获取文件名,日志行号和最新函数名称;Sava日志到文件。

caption-json-formatter。添加了人类可读标题的logrus消息json格式化程序。

您可以通过实现Formatter接口(需要一种Format方法)来定义格式化程序。Format需要一个*Entry。entry.Data是一种 Fields类型(map[string]interface{}),其中包含您的所有字段以及默认字段(请参见上面的条目部分):

type MyJSONFormatter struct {
}
log.SetFormatter(new(MyJSONFormatter))
func (f *MyJSONFormatter) Format(entry *Entry) ([]byte, error) {
  // Note this doesn't include Time, Level and Message which are available on
  // the Entry. Consult `godoc` on information about those fields or read the
  // source of the official loggers.
  serialized, err := json.Marshal(entry.Data)
    if err != nil {
      return nil, fmt.Errorf("Failed to marshal fields to JSON, %v", err)
    }
  return append(serialized, '\n'), nil
}
Copier après la connexion

记录为 io.Writer

Logrus可以转换为io.Writer。该作家是an的结尾,io.Pipe您有责任关闭它。

w := logger.Writer()
defer w.Close()
srv := http.Server{
    // create a stdlib log.Logger that writes to
    // logrus.Logger.
    ErrorLog: log.New(w, "", 0),
}
Copier après la connexion

写入该写入器的每一行都将使用格式化程序和钩子以常规方式打印。这些条目的级别为info。

这意味着我们可以轻松覆盖标准库记录器:

logger := logrus.New()
logger.Formatter = &logrus.JSONFormatter{}
// Use logrus for standard log output
// Note that `log` here references stdlib's log
// Not logrus imported under the name `log`.
log.SetOutput(logger.Writer())
Copier après la connexion

日志轮换

Logrus不提供日志轮换。日志轮换应由logrotate(8)可以压缩和删除旧日志条目的外部程序(如)完成。它不应该是应用程序级记录器的功能。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment lire et écrire des fichiers en toute sécurité avec Golang ? Comment lire et écrire des fichiers en toute sécurité avec Golang ? Jun 06, 2024 pm 05:14 PM

Lire et écrire des fichiers en toute sécurité dans Go est crucial. Les directives incluent : Vérification des autorisations de fichiers Fermeture de fichiers à l'aide de reports Validation des chemins de fichiers Utilisation de délais d'attente contextuels Le respect de ces directives garantit la sécurité de vos données et la robustesse de vos applications.

Comment configurer le pool de connexions pour la connexion à la base de données Golang ? Comment configurer le pool de connexions pour la connexion à la base de données Golang ? Jun 06, 2024 am 11:21 AM

Comment configurer le pool de connexions pour les connexions à la base de données Go ? Utilisez le type DB dans le package base de données/sql pour créer une connexion à la base de données ; définissez MaxOpenConns pour contrôler le nombre maximum de connexions simultanées ; définissez MaxIdleConns pour définir le nombre maximum de connexions inactives ; définissez ConnMaxLifetime pour contrôler le cycle de vie maximum de la connexion ;

Comparaison des avantages et des inconvénients du framework Golang Comparaison des avantages et des inconvénients du framework Golang Jun 05, 2024 pm 09:32 PM

Le framework Go se distingue par ses hautes performances et ses avantages en matière de concurrence, mais il présente également certains inconvénients, tels qu'être relativement nouveau, avoir un petit écosystème de développeurs et manquer de certaines fonctionnalités. De plus, les changements rapides et les courbes d’apprentissage peuvent varier d’un cadre à l’autre. Le framework Gin est un choix populaire pour créer des API RESTful en raison de son routage efficace, de sa prise en charge JSON intégrée et de sa puissante gestion des erreurs.

Golang Framework vs Go Framework : comparaison de l'architecture interne et des fonctionnalités externes Golang Framework vs Go Framework : comparaison de l'architecture interne et des fonctionnalités externes Jun 06, 2024 pm 12:37 PM

La différence entre le framework GoLang et le framework Go se reflète dans l'architecture interne et les fonctionnalités externes. Le framework GoLang est basé sur la bibliothèque standard Go et étend ses fonctionnalités, tandis que le framework Go se compose de bibliothèques indépendantes pour atteindre des objectifs spécifiques. Le framework GoLang est plus flexible et le framework Go est plus facile à utiliser. Le framework GoLang présente un léger avantage en termes de performances et le framework Go est plus évolutif. Cas : gin-gonic (framework Go) est utilisé pour créer l'API REST, tandis qu'Echo (framework GoLang) est utilisé pour créer des applications Web.

Quelles sont les meilleures pratiques pour la gestion des erreurs dans le framework Golang ? Quelles sont les meilleures pratiques pour la gestion des erreurs dans le framework Golang ? Jun 05, 2024 pm 10:39 PM

Meilleures pratiques : créer des erreurs personnalisées à l'aide de types d'erreurs bien définis (package d'erreurs) fournir plus de détails consigner les erreurs de manière appropriée propager correctement les erreurs et éviter de masquer ou de supprimer les erreurs Wrap si nécessaire pour ajouter du contexte

Comment enregistrer les données JSON dans la base de données dans Golang ? Comment enregistrer les données JSON dans la base de données dans Golang ? Jun 06, 2024 am 11:24 AM

Les données JSON peuvent être enregistrées dans une base de données MySQL à l'aide de la bibliothèque gjson ou de la fonction json.Unmarshal. La bibliothèque gjson fournit des méthodes pratiques pour analyser les champs JSON, et la fonction json.Unmarshal nécessite un pointeur de type cible pour désorganiser les données JSON. Les deux méthodes nécessitent la préparation d'instructions SQL et l'exécution d'opérations d'insertion pour conserver les données dans la base de données.

Comment résoudre les problèmes de sécurité courants dans le framework Golang ? Comment résoudre les problèmes de sécurité courants dans le framework Golang ? Jun 05, 2024 pm 10:38 PM

Comment résoudre les problèmes de sécurité courants dans le framework Go Avec l'adoption généralisée du framework Go dans le développement Web, il est crucial d'assurer sa sécurité. Ce qui suit est un guide pratique pour résoudre les problèmes de sécurité courants, avec un exemple de code : 1. Injection SQL Utilisez des instructions préparées ou des requêtes paramétrées pour empêcher les attaques par injection SQL. Par exemple : constquery="SELECT*FROMusersWHEREusername=?"stmt,err:=db.Prepare(query)iferr!=nil{//Handleerror}err=stmt.QueryR

Comment trouver la première sous-chaîne correspondant à une expression régulière Golang ? Comment trouver la première sous-chaîne correspondant à une expression régulière Golang ? Jun 06, 2024 am 10:51 AM

La fonction FindStringSubmatch recherche la première sous-chaîne correspondant à une expression régulière : la fonction renvoie une tranche contenant la sous-chaîne correspondante, le premier élément étant la chaîne entière correspondante et les éléments suivants étant des sous-chaînes individuelles. Exemple de code : regexp.FindStringSubmatch(text,pattern) renvoie une tranche de sous-chaînes correspondantes. Cas pratique : Il peut être utilisé pour faire correspondre le nom de domaine dans l'adresse email, par exemple : email:="user@example.com", pattern:=@([^\s]+)$ pour obtenir la correspondance du nom de domaine [1].

See all articles