Votre question est très vaste et il est difficile de recommander une approche unique. Mais puisque vous regardez une option append-only, vous aurez besoin d'un format qui ne nécessite pas de pied de page. Par exemple. vous ne pouvez pas utiliser XML, car XML doit avoir des balises de fermeture et vous ne devez pas simplement ajouter des données.
Une option évidente est un format de fichier délimité, qu'il s'agisse d'un onglet ou d'un texte délimité par des virgules. Ils sont pratiquement universels et bien définis. Ils sont aussi assez compacts, juste un caractère pour délimiter les champs. Cependant, ils ne sont pas bons pour les données qui changent ligne par ligne. Par exemple. une ligne a des valeurs pour les champs A, B, C mais une autre ligne contient des valeurs pour les champs A, D et E. Dans ce cas, vous aurez peut-être besoin d'un format définissant le type de données dans un enregistrement par enregistrement. Un exemple d'un tel format est HL7 (https://en.wikipedia.org/wiki/Health_Level_7). C'est un format délimité mais chaque ligne a un "en-tête" indiquant le type d'enregistrement. Si vous cherchez une option plus performante, vous pouvez créer votre propre format en fonction de vos données, et même le stocker en format binaire, et même utiliser la compression (Voir DéflateStream https://msdn.microsoft.com/en-us/library/system.io.compression.deflatestream(v=vs.110).aspx) pour réduire le fichier I/O. Cela rendra les opérations d'écriture un peu plus gourmandes en ressources processeur mais les E/S sont généralement plus lentes, donc dans l'ensemble, d'autant plus que le texte se compresse vraiment bien, vous pourriez vous retrouver avec des gains de performance. Vous devrez faire un benchmark pour être sûr de votre cas d'utilisation. Enfin, vous voudriez une classe capable de gérer l'écriture (écriture en cache/en file d'attente, conserver le gestionnaire de fichiers, etc.) afin que le code d'appel puisse être simplifié et synchronisé en un seul endroit. Vous pouvez faire cela asynchrone, si l'appelant peut continuer son travail et que votre script s'assurera que les données l'intègrent, ou synchrone s'il s'agit d'un "journal des transactions", ce qui signifie que la perte est inacceptable et que l'appelant doit s'assurer réellement arrivé.
Encore une fois, il s'agit d'informations de très haut niveau puisque votre demande est tout aussi vague et de haut niveau. Si vous venez avec plus de détails, peut-être que nous pouvons mieux vous aider.