[PYTHON] Fichier journal de sortie avec Job (Notebook) de Cloud Pak for Data

Il s'agit d'une méthode pour générer un journal lorsqu'un Job créé à partir de Notebook est exécuté dans un projet d'analyse de Cloud Pak for Data (ci-après CP4D).

En arrière-plan, à partir de CP4D v3.0, il n'est pas possible d'inclure des messages de journal arbitraires dans le journal d'exécution du Job.

Détails: Journal d'exécution des travaux

Lorsque vous ouvrez le travail du projet d'analyse et cliquez sur la partie d'horodatage qui est le résultat de l'exécution,

image.png

Le journal d'exécution s'affiche. Cependant, ce journal n'est enregistré pour l'environnement Python que lorsque Job (Notebook) est exécuté et aucun message de journal ne peut être écrit ici. (Au 11 juin 2020 CP4D v3.0 LA) image.png

Pour contourner ce problème, j'ai créé un moyen de générer le journal dans un fichier à partir de Notebook et de l'enregistrer en tant qu'actifs de données pour le projet d'analyse.

Exemple de notebook pour générer un fichier journal

Utilisez Python standard Logger pour générer des journaux à la fois sur la console (sortie dans Notebook) et dans le fichier journal. Les fichiers journaux sont enregistrés dans les actifs de données du projet d'analyse à l'aide de project_lib. Pour les paramètres de journal, veuillez consulter cet article.

Écrivez ceci au début de votre cahier


from pytz import timezone
from datetime import datetime

#paramètres de l'enregistreur
logger = logging.getLogger("mylogger")
logger.setLevel(logging.DEBUG)

#Paramètres de format de journal
def customTime(*args):
    return datetime.now(timezone('Asia/Tokyo')).timetuple()
formatter = logging.Formatter(
    fmt='%(asctime)s.%(msecs)-3d %(levelname)s : %(message)s',
    datefmt="%Y-%m-%d %H:%M:%S"
)
formatter.converter = customTime

#Paramètres du gestionnaire pour la sortie du journal vers la console(Pour affichage dans Notebook. Niveau spécifié comme DEBUG)
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)
sh.setFormatter(formatter)
logger.addHandler(sh)

#Paramètres du gestionnaire pour la sortie du journal dans un fichier(Pour l'exécution du travail. Le niveau est spécifié dans INFO. Exportez le fichier journal dans le répertoire actuel et enregistrez-le ultérieurement dans Data Asset.)
logfilename = "mylog_" + datetime.now(timezone('Asia/Tokyo')).strftime('%Y%m%d%H%M%S') + ".log"
fh = logging.FileHandler(logfilename)
fh.setLevel(logging.INFO)
fh.setFormatter(formatter)
logger.addHandler(fh)

#Bibliothèque d'enregistrement des actifs de données
import io
from project_lib import Project
project = Project.access()

Voici un exemple de son utilisation.

try:
    logger.info('%s', 'Le traitement a commencé')
    #Écrivez le processus que vous souhaitez faire ici
    
    #Message de journal de sortie à tout moment
    logger.debug('%s', 'dummy debug message')
    logger.info('%s', 'dummy info message')
    
    #Générer intentionnellement une erreur(Diviser par 0)
    test = 1/0
    
except Exception as e:
    logger.exception('%s', str(repr(e)))
    #Exporter les fichiers journaux vers Data Asset(Lorsqu'une erreur survient)
    with open(logfilename, 'rb') as z:
        data = io.BytesIO(z.read())
        project.save_data(logfilename, data, set_project_asset=True, overwrite=True)

#Exporter les fichiers journaux vers Data Asset(À la fin de la normale)
with open(logfilename, 'rb') as z:
    data = io.BytesIO(z.read())
    project.save_data(logfilename, data, set_project_asset=True, overwrite=True)

Résultat d'exécution

Lorsque je l'exécute dans Notebook, le journal est obtenu comme sortie, comme indiqué ci-dessous, et le fichier journal est généré dans l'actif de données.

Sortie lors de l'exécution dans Notebook


2020-06-11 07:43:12.383 INFO :Le traitement a commencé
2020-06-11 07:43:12.388 INFO : dummy info message
2020-06-11 07:43:12.389 ERROR : ZeroDivisionError('division by zero',)
Traceback (most recent call last):
  File "<ipython-input-7-0b7d7ffe66e9>", line 10, in <module>
    test = 1/0
ZeroDivisionError: division by zero

De plus, si vous enregistrez la version de Notebook, créez un Job et exécutez le Job, un fichier journal sera généré dans l'actif de données.

Le fichier journal généré ressemble à ceci. image.png Je vais le télécharger et vérifier le contenu. Le fichier journal a un niveau INFO et ne contient donc pas de messages DEBUG. image.png

Considération sur le nom du fichier journal

Le fait que les actifs de données soient remplis de fichiers journaux n'est pas agréable compte tenu de l'utilisation initiale des actifs de données. Par conséquent, il est concevable de toujours écraser le fichier journal en un seul. Cependant, comme CP4D est OpenShift (Kubernates), l'environnement Python de Job est créé en tant que pod au moment de l'exécution et disparaît une fois terminé. Par conséquent, dans le cas d'un seul nom de fichier, seule la dernière exécution du Job est enregistrée dans le fichier journal et l'historique passé sera effacé par écrasement. Par conséquent, dans l'exemple ci-dessus, j'ai essayé de conserver l'historique en incluant l'horodatage dans le nom du fichier journal. Veuillez ajuster cette zone en fonction de l'application.

Comme mentionné ci-dessus, il n'est pas bon que les actifs de données soient remplis de journaux, mais jusqu'à ce qu'il devienne possible de générer des journaux arbitraires dans le journal des tâches d'origine, il n'y a pas d'autre choix que de le surpasser pendant un certain temps. Une autre méthode consiste à enregistrer le journal dans la table DB.

Recommended Posts

Fichier journal de sortie avec Job (Notebook) de Cloud Pak for Data
Exécuter l'API de Cloud Pak for Data Analysis Project Job avec des variables d'environnement
Déployez des fonctions avec Cloud Pak for Data
Éliminez les caractères japonais brouillés dans les graphiques matplotlib avec Cloud Pak for Data Notebook
Analyse des données pour améliorer POG 2 ~ Analyse avec le notebook jupyter ~
Sortie CSV des données d'impulsion avec Raspberry Pi (sortie CSV)
J'ai créé une fenêtre pour la sortie du journal avec Tkinter
Enregistrez les données pandas dans des actifs de données au format Excel avec Cloud Pak for Data (Watson Studio)
Recommandation de Jupyter Notebook, un environnement de codage pour les data scientists
Bibliothèque standard de journalisation Python pour la sortie de fichier par niveau de journal
[Analyse du cours de l'action] pandas apprenant avec des données fictives (002: sortie log)
Apprentissage amélioré 7 Sortie du journal des données d'apprentissage
Sortie csv avec un nombre différent de chiffres pour chaque colonne avec numpy
Sortie vers un fichier csv avec Python
[Cloud102] # 3-1 Bonus pour AML Studio NOTEBOOK
Sortie du journal de test unitaire avec python
Conversion matricielle d'économie de mémoire des données de journal
Notes pour l'entrée / sortie de fichier Python
4ème nuit de boucle avec pour
Sortie CSV des données d'impulsion avec Raspberry Pi (vérifier l'entrée analogique avec python)
Configuration initiale de Jupyter Notebook pour les amoureux de Vim ・ Quitter avec jj (jupyter-vim-binding)
Exemple d'opération d'objet Cloud Pak for Data en Python (client WML, project_lib)