2
votes

Les journaux de GCF dans Go ne contiennent pas de niveau de journal

J'essaie d'envoyer des journaux d'informations / d'erreurs à StackDriver Logging sur GCP à partir de Cloud Function écrit en Go, mais tous les journaux n'ont pas d'attribution de niveau de journal.

J'ai créé une fonction à partir de https: // github.com/GoogleCloudPlatform/golang-samples/blob/master/functions/helloworld/hello_logging.go pour démontrer le problème.

 lien vers l'image avec les journaux


0 commentaires

4 Réponses :


1
votes

Assistance Cloud ici! Ce que vous essayez de faire n’est pas possible, comme spécifié dans le documentation :

  • Les journaux vers stdout ou stderr n'ont pas de niveau de journal associé.

  • Les messages système internes ont le niveau de journalisation DEBUG .

Ce dont vous avez probablement besoin est d'utiliser l ' API de journalisation , en particulier l' < une section href = "https://godoc.org/cloud.google.com/go/logging#hdr-Log_Levels" rel = "nofollow noreferrer"> Niveaux de journalisation .

Si cela ne fonctionne pas pour vous non plus, vous pouvez essayer d'utiliser node.js au lieu de go car émet actuellement des journaux vers INFO et ERROR niveaux en utilisant respectivement console.log () et console.error () .


4 commentaires

J'ai essayé d'utiliser cette bibliothèque mais je n'arrive pas à la faire fonctionner. Il ne renvoie aucune erreur mais rien n'est enregistré dans stackdriver.


Bonjour @nephe J'ai modifié ma réponse avec une autre solution possible pour vous. Je voudrais également que vous exécutiez cette commande: gcloud functions logs read FUNCTION_NAME , et vérifiez si vous pouvez voir les logs là-dedans.


J'ai essayé et il renvoie également des journaux sans aucun niveau, uniquement ceux produits par un enregistreur standard, pas celui que vous avez aligné. Pouvez-vous me relier au problème où je peux surveiller quand ce type de support sera ajouté à GCF dans Go?


J'ai trouvé ce problème public demandant la mise en œuvre de la gravité de la journalisation pour GCF en général. En outre, j'ai créé ce problème demandant la gravité de la journalisation pour GCF dans Go spécifiquement.



0
votes

vous pouvez utiliser une bibliothèque externe qui vous permet de définir le niveau de journalisation. Voici un exemple de ce que j'utilise. Utilisez logrus pour définir le niveau de journalisation minimal (vous pouvez améliorer ce code en fournissant un niveau de journalisation dans env var) et joonix pour le formateur fluentd. (Ligne 25)

Un point d'attention. Ligne 11, je renomme le journal du package logrus log "github.com/sirupsen/logrus" Ainsi, n'utilisez pas la bibliothèque standard de journal, mais la bibliothèque logrus. C'est parfois ennuyeux ... vous pouvez simplement remplacer log par logrus pour éviter toute confusion.

Joonix est un formateur fluentD pour transformer les journaux en un format ingérable pour Stackdriver.


4 commentaires

J'ai essayé avec le formateur que vous avez fourni mais il se comporte toujours de manière invalide. Tout est ajouté sous forme de texte textPayload: "{" httpRequest ": {" requestMethod ":" POST "," status ": 200," respon‌ seSize ":" 31337 "," use‌ rAgent ":" Go -http-cli‌ ent / 1.1 "," latence ": {‌" nanos ": 123000000}}, ‌" message ":" info supplémentaire "," gravité ":" INFO "," horodatage ": {"seconds": 1565175967, "n‌ anos": 261743604}} "


Oui, il y a une chose délicate. Regardez la ligne 11 log "github.com/sirupsen/logrus" Je renomme le paquet logrus en log. Ensuite, j'utilise log.debugf (...) pour me connecter au niveau de débogage. Le formateur ne transforme la sortie qu'au format fluentD, pour une ingestion compréhensible par stackdriver.


Je ne sais pas si je vous comprends. J'utilise los comme github.com/sirupsen/logrus . Ensuite, j'ai défini le formateur sur joonix et le niveau sur Debug . Cependant, il résulte toujours en tant que charge utile de texte dans stackdriver.


Vous avez raison. Cela fonctionne sur Cloud Run et GCE / GKE, mais pas sur Cloud Function. J'ai effectué des tests avec différentes configurations d'enregistreurs. Je ne comprends pas ce qui est différent et pourquoi cela ne fonctionne pas.



2
votes

Le runtime Go 1.13 ne définit plus les variables d'environnement nécessaires au fonctionnement de mon approche précédente.

Création d'une nouvelle bibliothèque qui adopte une approche différente: github.com/ncruces/go-gcp/glog code>

Du côté positif, la nouvelle version est compatible avec Google Cloud Run. Il fonctionne également sur l'environnement d'exécution Go 1.11.

Utilisation:

func HelloBackground(ctx context.Context, m interface{}) error {
    logging.Info(ctx).Println("Hello logs")
    logging.Error(ctx).Println("Hello logs")
    return nil
}

Réponse précédente

Vous êtes les bienvenus dans utilisez la bibliothèque suivante: github.com/ncruces/go-gcf/logging

Les niveaux de journal sont pris en charge, de même que les identifiants d'exécution.

Utilisation:

func HelloWorld(w http.ResponseWriter, r *http.Request) {
    ctx := logging.ForRequest(r)
    // ...
    logging.Info(ctx).Println("Hello logs")
    logging.Error(ctx).Println("Hello logs")
}

Ou, pour un fonction d'arrière-plan:

func HelloWorld(w http.ResponseWriter, r *http.Request) {
    glog.Infoln("Hello logs")
    glog.Errorln("Hello logs")
}

Divulgation complète: je suis l'auteur. Je l'utilise en production depuis 6 mois. Vos commentaires sont appréciés.


2 commentaires

Merci, il semble que cela fonctionne correctement et qu'il définit des niveaux d'erreur valides.


Bonjour, j'aimerais savoir quelles autorisations dois-je donner à mes fonctions pour qu'elles puissent utiliser l'API. Je reçois actuellement une erreur d'autorisation en essayant d'utiliser mon code



1
votes

Moi aussi, j'ai essayé de créer un package pour cela. Si vous utilisez logrus ( https://github.com/sirupsen/logrus ), cela peut être utile:

https://github.com/tekkamanendless/gcfhook

J'utilise ceci en production et cela fonctionne très bien.


0 commentaires