Comment ajouter des journaux personnalisés à CloudWatch? Les journaux par défaut sont envoyés, mais comment en ajouter un personnalisé?
J'ai déjà ajouté un fichier comme celui-ci: (en .ebextensions)
files:
"/opt/elasticbeanstalk/tasks/bundlelogs.d/applogs.conf" :
mode: "000755"
owner: root
group: root
content: |
/var/app/current/logs/*
"/opt/elasticbeanstalk/tasks/taillogs.d/cloud-init.conf" :
mode: "000755"
owner: root
group: root
content: |
/var/app/current/logs/*
Comme je l'ai fait bundlelogs.d et taillogs.d, ces journaux personnalisés sont maintenant suivis ou récupérés à partir de la console ou du Web, c'est bien mais ils ne persistent pas et ne sont pas envoyés sur CloudWatch.
Dans CloudWatch, j'ai les journaux par défaut comme/aws/elasticbeanstalk/InstanceName/var/log/eb-activity.log
Et je veux en avoir un autre comme celui-ci/aws/elasticbeanstalk/InstanceName/var/app/current/logs/mycustomlog.log
bundlelogs.d et taillogs.d sont des journaux récupérés à partir de la console de gestion . Ce que vous voulez faire, c'est étendre les journaux par défaut (par exemple, eb-activity.log) aux journaux CloudWatch. Pour étendre le flux de journaux, vous devez ajouter une autre configuration sous /etc/awslogs/config/
. La configuration doit suivre le Format de fichier de configuration de l'agent .
J'ai réussi à étendre mes journaux pour ma plateforme ubuntu/nginx/php personnalisée. Voici mon fichier d'extension FYI. Voici un échantillon officiel FYI.
Dans votre cas, ça pourrait être comme
files:
"/etc/awslogs/config/my_app_log.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/app/current/logs/xxx.log]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/app/current/logs/xxx.log"]]}`
log_stream_name = {instance_id}
file = /var/app/current/logs/xxx.log*
Les crédits dus reviennent à Sebastian Hs et Abhyudit Jain .
Ceci est le fichier config
final que j'ai trouvé pour .ebextensions
pour notre cas d'utilisation particulier. Les notes expliquant certains aspects se trouvent sous le bloc de code.
files:
"/etc/awslogs/config/beanstalklogs_custom.conf" :
mode: "000600"
owner: root
group: root
content: |
[/var/log/Tomcat8/catalina.out]
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Fn::Select" : [ "1", { "Fn::Split" : [ "-", { "Ref":"AWSEBEnvironmentName" } ] } ] }, "var/log/Tomcat8/catalina.out"]]}`
log_stream_name = `{"Fn::Join":["--", [{ "Ref":"AWSEBEnvironmentName" }, "{instance_id}"]]}`
file = /var/log/Tomcat8/catalina.out*
services:
sysvinit:
awslogs:
files:
- "/etc/awslogs/config/beanstalklogs_custom.conf"
commands:
rm_beanstalklogs_custom_bak:
command: "rm beanstalklogs_custom.conf.bak"
cwd: "/etc/awslogs/config"
ignoreErrors: true
Nous avons un schéma de nommage standard pour nos environnements EB qui est exactement environmentName-environmentType
. J'utilise { "Fn::Split" : [ "-", { "Ref":"AWSEBEnvironmentName" } ] }
pour diviser cela en un tableau de deux chaînes (nom et type).
Ensuite, j'utilise { "Fn::Select" : [ "1", <<SPLIT_OUTPUT>> ] }
pour obtenir uniquement la chaîne de type. Vos besoins seraient évidemment différents, vous n'avez donc besoin que des éléments suivants:
log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/Tomcat8/catalina.out"]]}`
J'utilise le Fn::Join
fonction pour joindre le nom de l'environnement EB à l'ID d'instance. Notez que le modèle d'ID d'instance est une chaîne qui est reproduite exactement comme donnée.
Le service awslogs
est redémarré automatiquement lorsque le fichier personnalisé conf
est déployé.
Lorsque le bloc files
écrase un fichier existant, il crée un fichier de sauvegarde, comme beanstalklogs_custom.conf.bak
. Ce bloc efface ce fichier de sauvegarde car le service awslogs
lit les deux fichiers , ce qui peut provoquer un conflit.
Si vous vous connectez à une instance EC2 et Sudo cat
le fichier, vous devriez voir quelque chose comme ça. Notez que toutes les fonctions Fn
sont résolues. Si vous trouvez qu'une fonction Fn
n'a pas été résolue, recherchez-la pour des erreurs de syntaxe.
[/var/log/Tomcat8/catalina.out]
log_group_name = /aws/elasticbeanstalk/environmentType/var/log/Tomcat8/catalina.out
log_stream_name = environmentName-environmentType--{instance_id}
file = /var/log/Tomcat8/catalina.out*
L'agent awslogs
recherche dans le fichier de configuration les fichiers journaux qu'il est censé envoyer. Il y a quelques défauts par défaut. Vous devez le modifier et spécifier les fichiers.
Vous pouvez vérifier et éditer le fichier de configuration situé à:
/etc/awslogs/awslogs.conf
Assurez-vous de redémarrer le service:
Sudo service awslogs restart
Vous pouvez y spécifier vos propres fichiers et créer différents groupes et autres.
Veuillez vous référer au lien suivant et vous pourrez obtenir vos journaux en un rien de temps.
Ressources:
https://docs.aws.Amazon.com/AmazonCloudWatch/latest/logs/AgentReference.html
Éditer:
Comme vous ne souhaitez pas modifier les fichiers sur l'instance, vous pouvez ajouter le code approprié dans le dossier .ebextensions à la racine de votre code. Par exemple, voici mon 01_cloudwatch.config
:
packages:
yum:
awslogs: []
container_commands:
01_get_awscli_conf_file:
command: "aws s3 cp s3://project/awscli.conf /etc/awslogs/awscli.conf"
02_get_awslogs_conf_file:
command: "aws s3 cp s3://project/awslogs.conf.${NODE_ENV} /etc/awslogs/awslogs.conf"
03_restart_awslogs:
command: "Sudo service awslogs restart"
04_start_awslogs_at_system_boot:
command: "Sudo chkconfig awslogs on"
Dans cette configuration, je récupère le fichier de configuration approprié dans un compartiment S3 en fonction du NODE_ENV. Vous pouvez faire tout ce que vous voulez dans votre configuration.