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.
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,
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)
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.
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)
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. 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.
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