Bonjour;

Je suis actuellement en train de coder un serveur sous windows qui qui s'intégrera comme un service, et avant même de commencer à coder mon programme j'ai pensé que la meilleur chose serait de coder une bonne fonction qui récupère mes erreurs et une deuxième qui les log dans un fichier car aucune interaction avec un quelconque utilisateur n'est prévue au autorisé pour un service.

Mon problème est le suivant, j'ai mit ces deux fonction au point mais mon souci principale est que si une de ces deux fonctions échoue à cause des fonctions d'ouverture de fichier, de récupération de la date et autres qui ce trouve à l'intérieur de celle-ci, alors le messages de log n'apparaitra nul part et ces donc vraiment embétant pour débugger mon programme.

Ma question est,

Comment construire une fonction de log et récupération d'erreur efficace pour logger mes erreurs?

Celon-vous les messages d'erreurs du système sont-il suffisant?

Dois-je faire du contrôle d'erreur à l'intérieur de ces fonctions, est-ce vraiment utile?

Merci d'avance des pistes sur lesquelles vous pourrez me lancer.

Et bien sur si vous avez d'autre élément à apporter à ma réflexion je suis preneur.


voici mes deux fonctions pour le moment:

log d'erreur

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
int RecordedError(DWORD error_code,
					const char *error_msg,
					const char *failed_function,
					const char *comment
					const char *ip_client
					const char *port_com)
{
		// consigne la date,l'heure et l'erreur

		FILE *fichier = NULL;

		time_t date ;
		char *s_date = NULL;
		char *ptr = NULL;

		fichier = fopen("LOGFILE", "a");

		if( fichier != NULL)
		{
			/* recupere la date et l'heure */
			date = time(NULL);  // recupere la date en brut
			s_date = ctime(&date); // retourne la date en chaine

			/*	suprime le retour chariot de la chaine de la date */
			ptr = s_date ;
			ptr = ptr + (strlen(s_date) -1);
			*ptr = '\0';

			/*	log le fichier */
			fprintf(fichier,"%s : Ip Client %s : Port COM %s : %ld : %s : Failed function \"%s()\"  : %s", s_date, ip_client, port_com, error_code, error_msg, comment );

			fprintf(fichier, "\n");

			fclose(fichier);

			return 0;
		}
		else
		{
			exit(0);
		}
}
récupération d'erreur:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int get_error_msg(  char * buffer_error, int  buffer_size )
{
	LPVOID message;
	char * ptr;
	DWORD error_code, error_size;
	
	error_code = GetLastError();
	
	error_size = FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
										FORMAT_MESSAGE_FROM_SYSTEM |
										FORMAT_MESSAGE_IGNORE_INSERTS,
										NULL,
										error_code,
										0,
										(LPTSTR) &message;
										0,
										NULL);
							
	if( error =! 0 )
	{
			/*	suprime le retour chariot de la chaine	*/					
			ptr = error_buf ;
			ptr = ptr + (strlen(error_buf) -1);
			*ptr = '\0';
	
			if(error_size<buffer_size)
			{ 
				strcpy(message, buffer_error);
				LocalFree(message);
			}
			else exit(0);
	}
	else exit(0);

	return 0;	
}