Recuperer les journaux d'evenements

cs_zmaster Messages postés 9 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 6 décembre 2006 - 6 déc. 2006 à 09:10
cs_zmaster Messages postés 9 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 6 décembre 2006 - 6 déc. 2006 à 11:40
Salut !

Je dois, dans le cadre d'une politique de sécurité dans mon entreprise, récupérer les journaux d'évenements de mes serveurs, puis les stocker a quelque part pour ensuite générer des statistiques, des rapports etc...

Mon chef ne voulant pas dépenser un euro pour un produit du style : http://manageengine.adventnet.com/products/eventlog/index.html
Vu le peu de temps dont je disposais, je n'ai pas trop cherché des produits libres et/ou gratuits, du coup j'ai écrit un p'tit bout de code bien crade (c'est le cas de le dire) que j'ai rendu public ici : http://code.google.com/p/logscanner/

Si jamais vous êtes motivé pour filer un coup de main, (vu que je suis un gros nul en prog (specialement csharp)... ce serait cool).

Merci par avance, et bonne journée !

2 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
6 déc. 2006 à 10:59
Hello,

J'ai jeté un coup d'oeil à ton code, et j'ai juste deux ou trois conseils à te donner :

Les types énumérés ne sont pas à utiliser comme ça :

e.EntryType.ToString().Equals("Error")

mais plutôt comme ça :

e.EntryType = = EventLogEntryType.Error

Si tu dois formatter une date, ne fait si possible pas comme ça :
string timestamp = e.TimeGenerated.Year.ToString() + "-" + e.TimeGenerated.Month.ToString() + "-" + e.TimeGenerated.Day.ToString() + "-" + e.TimeGenerated.Hour.ToString() + "-" + e.TimeGenerated.Minute.ToString() + "-" + e.TimeGenerated.Second.ToString();

Mais plutôt 

string timestamp = e.TimeGenerated.ToString("yyyy-MM-dd-HH-mm-ss");

timestamp .ToString() est inutile, puisque timestamp est déjà un string.

Il est à mon avis inutile de remplir un ArrayList avec des éléments, si tu peux directement faire ta requête pour les mettre dans la DB.

pour ta base de donnée, j'espère que tu utilises bien les types Datetime pour timestamp et long pour instanceid non des string.

Un conseil encore, utilise des paramètre pour faire tes requêtes SQL, tu seras nettement moins embêté par des problèmes de culture, de format, ou simplement d'apostrophe dans un string.

En gros, voici le code tel que je le ferais :

maCommande.CommandText = "INSERT INTO eventlog (serveur, logtype, source, username, instanceid, timegenerated, message) VALUES (?,?,?,?,?,?,?)";
maCommande.Parameters.Add(
"@serveur",
OdbcType.VarChar);
maCommande.Parameters.Add(
"@logtype",
OdbcType.VarChar);
maCommande.Parameters.Add(
"@source",
OdbcType.VarChar);
maCommande.Parameters.Add(
"@username",
OdbcType.VarChar);
maCommande.Parameters.Add(
"@instanceid",
OdbcType.BigInt);
//OdbcType.BigInt correspond to system.Int64 or long.
maCommande.Parameters.Add(
"@timegenerated",
OdbcType.DateTime);
maCommande.Parameters.Add(
"@message",
OdbcType.VarChar, 50);

foreach (EventLogEntry e in evtLog.Entries)
{
   if (e.EntryType == EventLogEntryType.Error)
   {
      maCommande.Parameters[
"@serveur"].Value = serveur;
      maCommande.Parameters[
"@logtype"].Value = type;
      maCommande.Parameters[
"@source"].Value = e.Source;
      maCommande.Parameters[
"@username"].Value = e.UserName;
      maCommande.Parameters[
"@instanceid"].Value = e.InstanceId;
      maCommande.Parameters[
"@timegenerated"].Value = e.TimeGenerated;
      maCommande.Parameters[
"@message"].Value = e.Message;

      try
      {
         maCommande.ExecuteNonQuery();
      }
      catch (Exception e)
      {
         Console.Out.WriteLine(e.Message);
      }
   }
}
                       
La première partie peut être sortie de la boucle, comme elle ne change pas.
Pour rendre le code encore un peu plus propre, tu peut déclarer des constantes pour tes paramètres ("@...")

Je n'ai pas testé le code, mais en principe, il devrait fonctionner sans trop de modifications.

Amicalement, SharpMao
0
cs_zmaster Messages postés 9 Date d'inscription lundi 1 avril 2002 Statut Membre Dernière intervention 6 décembre 2006
6 déc. 2006 à 11:40
Merci beaucoup pour tes conseils, je tenterai de les appliquer dès que j'ai quelques minutes pour toucher au code.

Pour la requète SQL directement dans la boucle, je l'avais fait comme ça au début, mais il attend qu'a chaque fois l'insertion soit finie pour lire l'évenement suivant.

J'ai pas remarqué de grande différence au niveau du temps d'exécution, mais je me suis dit qu'il vallait peut-être mieux ne pas mélanger la récupération des données des journaux, avec l'insertion dans la base de données.

Bonne journée,
0
Rejoignez-nous